Hive-quick-guide

提供:Dev Guides
移動先:案内検索

ハイブ-はじめに

「ビッグデータ」という用語は、膨大な量、高速、および日々増加しているさまざまなデータを含む大規模なデータセットのコレクションに使用されます。 従来のデータ管理システムを使用して、ビッグデータを処理することは困難です。 そのため、Apache Software Foundationは、Hadoopと呼ばれるフレームワークを導入して、ビッグデータの管理と処理の課題を解決しました。

Hadoop

Hadoopは、分散環境でビッグデータを保存および処理するためのオープンソースフレームワークです。 これには2つのモジュールが含まれ、1つはMapReduce、もう1つはHadoop分散ファイルシステム(HDFS)です。

  • * MapReduce:*これは、コモディティハードウェアの大きなクラスターで大量の構造化、半構造化、および非構造化データを処理するための並列プログラミングモデルです。
  • HDFS: Hadoop分散ファイルシステムは、データセットの保存と処理に使用されるHadoopフレームワークの一部です。 汎用ハードウェアで実行するフォールトトレラントファイルシステムを提供します。

Hadoopエコシステムには、Hadoopモジュールを支援するために使用されるSqoop、Pig、Hiveなどのさまざまなサブプロジェクト(ツール)が含まれています。

  • * Sqoop:* HDFSとRDBMSの間でデータをインポートおよびエクスポートするために使用されます。
  • * Pig:* MapReduce操作用のスクリプトの開発に使用される手続き型言語プラットフォームです。
  • ハイブ: MapReduce操作を行うためのSQLタイプスクリプトの開発に使用されるプラットフォームです。

注意: MapReduce操作を実行するには、さまざまな方法があります。

  • 構造化、半構造化、および非構造化データにJava MapReduceプログラムを使用する従来のアプローチ。
  • Pigを使用して構造化および半構造化データを処理するMapReduceのスクリプトアプローチ。
  • Hiveを使用して構造化データを処理するMapReduceのHiveクエリ言語(HiveQLまたはHQL)。

ハイブとは

Hiveは、Hadoopで構造化データを処理するためのデータウェアハウスインフラストラクチャツールです。 ビッグデータを要約するためにHadoopの上に常駐し、クエリと分析を簡単にします。

当初、HiveはFacebookによって開発されましたが、後にApache Software Foundationが取り上げて、Apache Hiveという名前でオープンソースとしてさらに開発しました。 さまざまな企業で使用されています。 たとえば、AmazonはAmazon Elastic MapReduceでそれを使用します。

ハイブは違います

  • リレーショナルデータベース
  • オンライントランザクション処理(OLTP)の設計
  • リアルタイムのクエリと行レベルの更新のための言語

Hiveの機能

  • スキーマをデータベースに保存し、処理したデータをHDFSに保存します。
  • OLAP用に設計されています。
  • HiveQLまたはHQLと呼ばれるクエリ用のSQL型言語を提供します。 *親しみやすく、高速で、スケーラブルで、拡張可能です。

Hiveのアーキテクチャ

次のコンポーネント図は、Hiveのアーキテクチャを示しています。

Hive Architecture

このコンポーネント図には、さまざまなユニットが含まれています。 次の表は、各ユニットについて説明しています。

Unit Name Operation
User Interface Hive is a data warehouse infrastructure software that can create interaction between user and HDFS. The user interfaces that Hive supports are Hive Web UI, Hive command line, and Hive HD Insight (In Windows server).
Meta Store Hive chooses respective database servers to store the schema or Metadata of tables, databases, columns in a table, their data types, and HDFS mapping.
HiveQL Process Engine HiveQL is similar to SQL for querying on schema info on the Metastore. It is one of the replacements of traditional approach for MapReduce program. Instead of writing MapReduce program in Java, we can write a query for MapReduce job and process it.
Execution Engine The conjunction part of HiveQL process Engine and MapReduce is Hive Execution Engine. Execution engine processes the query and generates results as same as MapReduce results. It uses the flavor of MapReduce.
HDFS or HBASE Hadoop distributed file system or HBASE are the data storage techniques to store data into file system.

ハイブの働き

次の図は、HiveとHadoopの間のワークフローを示しています。

How Hive Works

次の表は、HiveがHadoopフレームワークと対話する方法を定義しています。

Step No. Operation
1
  • Execute Query*

コマンドラインやWeb UIなどのHiveインターフェイスは、クエリをJDBCドライバやJDBCなどのデータベースドライバに送信して実行します。

2

Get Plan

ドライバーは、クエリを解析して、構文とクエリプラン、またはクエリの要件をチェックするクエリコンパイラの助けを借ります。

3

Get Metadata

コンパイラはメタデータ要求をメタストア(任意のデータベース)に送信します。

4

Send Metadata

メタストアは、コンパイラへの応答としてメタデータを送信します。

5

Send Plan

コンパイラーは要件を確認し、ドライバーに計画を再送信します。 ここまでで、クエリの解析とコンパイルが完了しました。

6

Execute Plan

ドライバーは、実行プランを実行エンジンに送信します。

7

Execute Job

内部的に、実行ジョブのプロセスはMapReduceジョブです。 実行エンジンは、ジョブをNameノードにあるJobTrackerに送信し、このジョブをDataノードにあるTaskTrackerに割り当てます。 ここで、クエリはMapReduceジョブを実行します。

7.1

Metadata Ops

一方、実行中、実行エンジンはMetastoreでメタデータ操作を実行できます。

8

Fetch Result

実行エンジンは、データノードから結果を受け取ります。

9

Send Results

実行エンジンは、これらの結果の値をドライバーに送信します。

10

Send Results

ドライバーは結果をHive Interfacesに送信します。

Hive-インストール

Hive、Pig、HBaseなどのすべてのHadoopサブプロジェクトは、Linuxオペレーティングシステムをサポートしています。 したがって、LinuxフレーバーOSをインストールする必要があります。 Hiveのインストールでは、次の簡単な手順が実行されます。

ステップ1:JAVAインストールの確認

Hiveをインストールする前に、Javaをシステムにインストールする必要があります。 次のコマンドを使用して、Javaのインストールを確認しましょう。

$ java –version

Javaがすでにシステムにインストールされている場合、次の応答が表示されます。

java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)

システムにjavaがインストールされていない場合は、javaをインストールするための以下の手順に従ってください。

Javaのインストール

ステップI:

次のリンクhttp://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260l[][[1]] <最新バージョン>-X64.tar.gz)をダウンロードします。 .oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260l。

次に、jdk-7u71-linux-x64.tar.gzがシステムにダウンロードされます。

ステップII:

通常、ダウンロードしたjavaファイルは、ダウンロードフォルダーにあります。 それを確認し、次のコマンドを使用してjdk-7u71-linux-x64.gzファイルを抽出します。

$ cd Downloads/
$ ls
jdk-7u71-linux-x64.gz
$ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz

ステップIII:

すべてのユーザーがJavaを使用できるようにするには、「/usr/local/」の場所に移動する必要があります。 ルートを開き、次のコマンドを入力します。

$ su
password:
# mv jdk1.7.0_71/usr/local/
# exit

ステップIV:

PATHおよびJAVA_HOME変数を設定するには、次のコマンドを〜/.bashrcファイルに追加します。

export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=$PATH:$JAVA_HOME/bin

すべての変更を現在実行中のシステムに適用します。

$ source ~/.bashrc

ステップV:

次のコマンドを使用して、Javaの代替を構成します。

# alternatives --install/usr/bin/java/java/usr/local/java/bin/java 2

# alternatives --install/usr/bin/javac/javac/usr/local/java/bin/javac 2

# alternatives --install/usr/bin/jar/jar/usr/local/java/bin/jar 2

# alternatives --set java/usr/local/java/bin/java

# alternatives --set javac/usr/local/java/bin/javac

# alternatives --set jar/usr/local/java/bin/jar

上記で説明したように、ターミナルからコマンドjava -versionを使用してインストールを検証します。

ステップ2:Hadoopインストールの検証

Hiveをインストールする前に、Hadoopをシステムにインストールする必要があります。 次のコマンドを使用して、Hadoopのインストールを確認しましょう。

$ hadoop version

Hadoopがシステムにすでにインストールされている場合、次の応答が返されます。

Hadoop 2.4.1 Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4

Hadoopがシステムにインストールされていない場合は、次の手順に進みます。

Hadoopをダウンロードする

次のコマンドを使用して、Apache Software FoundationからHadoop 2.4.1をダウンロードして抽出します。

$ su
password:
# cd/usr/local
# wget http://apache.claz.org/hadoop/common/hadoop-2.4.1/
hadoop-2.4.1.tar.gz
# tar xzf hadoop-2.4.1.tar.gz
# mv hadoop-2.4.1/* to hadoop/
# exit

擬似分散モードでのHadoopのインストール

以下の手順を使用して、Hadoop 2.4.1を擬似分散モードでインストールします。

ステップI:Hadoopのセットアップ

次のコマンドを*〜/.bashrc *ファイルに追加することにより、Hadoop環境変数を設定できます。

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export
PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

すべての変更を現在実行中のシステムに適用します。

$ source ~/.bashrc

ステップII:Hadoopの構成

すべてのHadoop設定ファイルは、「$ HADOOP_HOME/etc/hadoop」の場所にあります。 Hadoopインフラストラクチャに応じて、これらの構成ファイルに適切な変更を加える必要があります。

$ cd $HADOOP_HOME/etc/hadoop

javaを使用してHadoopプログラムを開発するには、 JAVA_HOME 値をシステム内のjavaの場所に置き換えて、 hadoop-env.sh ファイルのjava環境変数をリセットする必要があります。

export JAVA_HOME=/usr/local/jdk1.7.0_71

以下に、Hadoopを構成するために編集する必要があるファイルのリストを示します。

*core-site.xml*
*core-site.xml* ファイルには、Hadoopインスタンスに使用されるポート番号、ファイルシステムに割り当てられたメモリ、データを保存するためのメモリ制限、読み取り/書き込みバッファのサイズなどの情報が含まれています。

core-site.xmlを開き、<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>

   <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:9000</value>
   </property>

</configuration>
*hdfs-site.xml*
*hdfs-site.xml* ファイルには、レプリケーションデータの値、namenodeパス、ローカルファイルシステムのdatanodeパスなどの情報が含まれています。 これは、Hadoopインフラストラクチャを保存する場所を意味します。

次のデータを想定します。

dfs.replication (data replication value) = 1

(In the following path/hadoop/is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)

namenode path =//home/hadoop/hadoopinfra/hdfs/namenode

(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path =//home/hadoop/hadoopinfra/hdfs/datanode

このファイルを開き、このファイルの<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>

   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>
   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode </value>
   </property>
   <property>
      <name>dfs.data.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/datanode </value >
   </property>

</configuration>
  • 注意:*上記のファイルでは、すべてのプロパティ値はユーザー定義であり、Hadoopインフラストラクチャに応じて変更できます。
*yarn-site.xml*

このファイルは、Hadoopに糸を設定するために使用されます。 yarn-site.xmlファイルを開き、このファイルの<configuration>タグと</configuration>タグの間に次のプロパティを追加します。

<configuration>

   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>

</configuration>
*mapred-site.xml*

このファイルは、使用しているMapReduceフレームワークを指定するために使用されます。 デフォルトでは、Hadoopにはyarn-site.xmlのテンプレートが含まれています。 まず、次のコマンドを使用して、mapred-site、xml.templateからmapred-site.xmlファイルにファイルをコピーする必要があります。

$ cp mapred-site.xml.template mapred-site.xml
*mapred-site.xml* ファイルを開き、このファイルの<configuration>タグと</configuration>タグの間に次のプロパティを追加します。
<configuration>

   <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>

</configuration>

Hadoopインストールの検証

次の手順を使用して、Hadoopのインストールを確認します。

ステップI:ノードのセットアップに名前を付ける

次のようにコマンド「hdfs namenode -format」を使用して、namenodeをセットアップします。

$ cd ~
$ hdfs namenode -format

期待される結果は次のとおりです。

10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to
retain 1 images with txid >= 0
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/*********************************************************** *
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
* ***********************************************************/

ステップII:Hadoop dfの検証

次のコマンドは、dfsを開始するために使用されます。 このコマンドを実行すると、Hadoopファイルシステムが起動します。

$ start-dfs.sh

予想される出力は次のとおりです。

10/24/14 21:37:56
Starting namenodes on [localhost]
localhost: starting namenode, logging to/home/hadoop/hadoop-2.4.1/logs/hadoop-hadoop-namenode-localhost.out
localhost: starting datanode, logging to/home/hadoop/hadoop-2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]

ステップIII:糸スクリプトの検証

次のコマンドを使用して、糸スクリプトを開始します。 このコマンドを実行すると、糸デーモンが起動します。

$ start-yarn.sh

予想される出力は次のとおりです。

starting yarn daemons
starting resourcemanager, logging to/home/hadoop/hadoop-2.4.1/logs/yarn-hadoop-resourcemanager-localhost.out
localhost: starting nodemanager, logging to/home/hadoop/hadoop-2.4.1/logs/yarn-hadoop-nodemanager-localhost.out

ステップIV:ブラウザーでHadoopにアクセスする

Hadoopにアクセスするためのデフォルトのポート番号は50070です。 次のURLを使用して、ブラウザーでHadoopサービスを取得します。

http://localhost:50070/

Hadoopブラウザ

ステップV:クラスターのすべてのアプリケーションを確認する

クラスターのすべてのアプリケーションにアクセスするためのデフォルトのポート番号は8088です。 このサービスにアクセスするには、次のURLを使用してください。

http://localhost:8088/

すべてのアプリケーション

ステップ3:Hiveをダウンロードする

このチュートリアルでは、hive-0.14.0を使用します。 次のリンクhttp://apache.petsads.us/hive/hive-0.14.0/[[[2]]]にアクセスしてダウンロードできます。/Downloadsディレクトリにダウンロードされると仮定します。 ここでは、このチュートリアル用に「apache-hive-0.14.0-bin.tar.gz」という名前のHiveアーカイブをダウンロードします。 次のコマンドを使用して、ダウンロードを確認します。

$ cd Downloads
$ ls

ダウンロードが成功すると、次の応答が表示されます。

apache-hive-0.14.0-bin.tar.gz

ステップ4:Hiveのインストール

システムにHiveをインストールするには、次の手順が必要です。 Hiveアーカイブが/Downloadsディレクトリにダウンロードされると仮定します。

Hive Archiveの抽出と検証

次のコマンドを使用して、ダウンロードを確認し、ハイブアーカイブを抽出します。

$ tar zxvf apache-hive-0.14.0-bin.tar.gz
$ ls

ダウンロードが成功すると、次の応答が表示されます。

apache-hive-0.14.0-bin apache-hive-0.14.0-bin.tar.gz

====/usr/local/hiveディレクトリへのファイルのコピー

スーパーユーザー「su-」からファイルをコピーする必要があります。 次のコマンドを使用して、抽出したディレクトリから/usr/local/hive”ディレクトリにファイルをコピーします。

$ su -
passwd:

# cd/home/user/Download
# mv apache-hive-0.14.0-bin/usr/local/hive
# exit

Hiveの環境をセットアップする

  • 〜/.bashrc *ファイルに次の行を追加することにより、Hive環境をセットアップできます。
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:/usr/local/Hadoop/lib/*:.
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.

〜/.bashrcファイルを実行するには、次のコマンドを使用します。

$ source ~/.bashrc

ステップ5:Hiveの構成

HadoopでHiveを構成するには、 $ HIVE_HOME/conf ディレクトリにある hive-env.sh ファイルを編集する必要があります。 次のコマンドは、Hive config フォルダーにリダイレクトし、テンプレートファイルをコピーします。

$ cd $HIVE_HOME/conf
$ cp hive-env.sh.template hive-env.sh

次の行を追加して、 hive-env.sh ファイルを編集します。

export HADOOP_HOME=/usr/local/hadoop

Hiveのインストールは正常に完了しました。 メタストアを構成するには、外部データベースサーバーが必要になりました。 Apache Derbyデータベースを使用します。

ステップ6:Apache Derbyのダウンロードとインストール

以下の手順に従って、Apache Derbyをダウンロードしてインストールします。

Apache Derbyのダウンロード

Apache Derbyをダウンロードするには、次のコマンドを使用します。 ダウンロードには時間がかかります。

$ cd ~
$ wget http://archive.apache.org/dist/db/derby/db-derby-10.4.2.0/db-derby-10.4.2.0-bin.tar.gz

次のコマンドを使用して、ダウンロードを確認します。

$ ls

ダウンロードが成功すると、次の応答が表示されます。

db-derby-10.4.2.0-bin.tar.gz

Derbyアーカイブの抽出と検証

以下のコマンドは、Derbyアーカイブの抽出と検証に使用されます。

$ tar zxvf db-derby-10.4.2.0-bin.tar.gz
$ ls

ダウンロードが成功すると、次の応答が表示されます。

db-derby-10.4.2.0-bin db-derby-10.4.2.0-bin.tar.gz

ファイルを/usr/local/derbyディレクトリにコピーする

スーパーユーザー「su-」からコピーする必要があります。 次のコマンドを使用して、抽出したディレクトリから/usr/local/derbyディレクトリにファイルをコピーします。

$ su -
passwd:
# cd/home/user
# mv db-derby-10.4.2.0-bin/usr/local/derby
# exit

Derbyの環境をセットアップする

  • 〜/.bashrc *ファイルに次の行を追加することにより、Derby環境をセットアップできます。
export DERBY_HOME=/usr/local/derby
export PATH=$PATH:$DERBY_HOME/bin
Apache Hive
18
export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derby.jar:$DERBY_HOME/lib/derbytools.jar
  • 〜/.bashrc *ファイルを実行するには、次のコマンドを使用します。
$ source ~/.bashrc

メタストアを保存するディレクトリを作成します

$ DERBY_HOMEディレクトリにdataという名前のディレクトリを作成して、メタストアデータを保存します。

$ mkdir $DERBY_HOME/data

これで、Derbyのインストールと環境設定が完了しました。

ステップ7:Hiveのメタストアの構成

メタストアの構成とは、データベースの保存場所をHiveに指定することを意味します。 これを行うには、$ HIVE_HOME/confディレクトリにあるhive-site.xmlファイルを編集します。 まず、次のコマンドを使用してテンプレートファイルをコピーします。

$ cd $HIVE_HOME/conf
$ cp hive-default.xml.template hive-site.xml
*hive-site.xml* を編集し、<configuration>タグと</configuration>タグの間に次の行を追加します。
<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:derby://localhost:1527/metastore_db;create=true </value>
   <description>JDBC connect string for a JDBC metastore </description>
</property>

jpox.propertiesという名前のファイルを作成し、次の行を追加します。

javax.jdo.PersistenceManagerFactoryClass =

org.jpox.PersistenceManagerFactoryImpl
org.jpox.autoCreateSchema = false
org.jpox.validateTables = false
org.jpox.validateColumns = false
org.jpox.validateConstraints = false
org.jpox.storeManagerType = rdbms
org.jpox.autoCreateSchema = true
org.jpox.autoStartMechanismMode = checked
org.jpox.transactionIsolation = read_committed
javax.jdo.option.DetachAllOnCommit = true
javax.jdo.option.NontransactionalRead = true
javax.jdo.option.ConnectionDriverName = org.apache.derby.jdbc.ClientDriver
javax.jdo.option.ConnectionURL = jdbc:derby://hadoop1:1527/metastore_db;create = true
javax.jdo.option.ConnectionUserName = APP
javax.jdo.option.ConnectionPassword = mine

ステップ8:Hiveインストールの検証

Hiveを実行する前に、HDFSに /tmp フォルダーと別のHiveフォルダーを作成する必要があります。 ここでは、 /user/hive/warehouse フォルダーを使用します。 以下に示すように、これらの新しく作成されたフォルダーに書き込み許可を設定する必要があります。

chmod g+w

Hiveを検証する前に、HDFSでそれらを設定します。 次のコマンドを使用します。

$ $HADOOP_HOME/bin/hadoop fs -mkdir/tmp
$ $HADOOP_HOME/bin/hadoop fs -mkdir/user/hive/warehouse
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w/tmp
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w/user/hive/warehouse

Hiveのインストールを確認するには、次のコマンドを使用します。

$ cd $HIVE_HOME
$ bin/hive

Hiveが正常にインストールされると、次の応答が表示されます。

Logging initialized using configuration in jar:file:/home/hadoop/hive-0.9.0/lib/hive-common-0.9.0.jar!/hive-log4j.properties
Hive history file=/tmp/hadoop/hive_job_log_hadoop_201312121621_1494929084.txt
………………….
hive>

次のサンプルコマンドを実行して、すべてのテーブルを表示します。

hive> show tables;
OK
Time taken: 2.798 seconds
hive>

Hive-データ型

この章では、テーブル作成に関係するHiveのさまざまなデータ型について説明します。 Hiveのすべてのデータタイプは、次の4つのタイプに分類されます。

  • 列タイプ
  • リテラル
  • ヌル値 *複合型

列タイプ

列タイプは、Hiveの列データタイプとして使用されます。 それらは以下のとおりです。

積分型

整数型データは、整数データ型INTを使用して指定できます。 データ範囲がINTの範囲を超える場合、BIGINTを使用する必要があり、データ範囲がINTより小さい場合、SMALLINTを使用します。 TINYINTはSMALLINTよりも小さいです。

次の表は、さまざまなINTデータ型を示しています。

Type Postfix Example
TINYINT Y 10Y
SMALLINT S 10S
INT - 10
BIGINT L 10L

文字列型

文字列型のデータ型は、単一引用符( )または二重引用符( "")を使用して指定できます。 VARCHARとCHARの2つのデータ型が含まれています。 HiveはCタイプのエスケープ文字に従います。

次の表は、さまざまなCHARデータ型を示しています。

Data Type Length
VARCHAR 1 to 65355
CHAR 255

タイムスタンプ

オプションのナノ秒精度の従来のUNIXタイムスタンプをサポートします。 java.sql.Timestamp形式「YYYY-MM-DD HH:MM:SS.fffffffff」および形式「yyyy-mm-dd hh:mm:ss.ffffffffff」をサポートしています。

日付

DATE値は、年/月/日の形式で\ {\ {YYYY-MM-DD}}の形式で記述されます。

小数

HiveのDECIMAL型は、JavaのBig Decimal形式と同じです。 不変の任意精度を表すために使用されます。 構文と例は次のとおりです。

DECIMAL(precision, scale)
decimal(10,0)

ユニオンの種類

Unionは、異種データ型のコレクションです。* create union *を使用してインスタンスを作成できます。 構文と例は次のとおりです。

UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>

{0:1}
{1:2.0}
{2:["three","four"]}
{3:{"a":5,"b":"five"}}
{2:["six","seven"]}
{3:{"a":8,"b":"eight"}}
{0:9}
{1:10.0}

リテラル

Hiveでは次のリテラルが使用されます。

浮動小数点型

浮動小数点型は、小数点付きの数字にすぎません。 一般に、このタイプのデータはDOUBLEデータタイプで構成されます。

小数タイプ

^ -308308 ^

ヌル値

欠損値は、特別な値NULLで表されます。

複合型

Hiveの複合データ型は次のとおりです。

配列

Hiveの配列は、Javaで使用されるのと同じ方法で使用されます。

Syntax: ARRAY<data_type>

Maps

HiveのマップはJavaマップに似ています。

Syntax: MAP<primitive_type, data_type>

構造体

Hiveの構造は、コメント付きの複雑なデータの使用に似ています。

Syntax: STRUCT<col_name : data_type [COMMENT col_comment], ...>

Hive-データベースの作成

Hiveは、データベースとテーブルを定義して構造化データを分析できるデータベーステクノロジーです。 構造化データ分析のテーマは、データを表形式で保存し、クエリを渡して分析することです。 この章では、Hiveデータベースの作成方法について説明します。 Hiveには、 default という名前のデフォルトデータベースが含まれています。

データベースステートメントの作成

Create Databaseは、Hiveでデータベースを作成するために使用されるステートメントです。 Hiveのデータベースは、*名前空間*またはテーブルのコレクションです。 このステートメントの*構文*は次のとおりです。

CREATE DATABASE|SCHEMA [IF NOT EXISTS] <database name>

ここで、IF NOT EXISTSはオプションの句であり、同じ名前のデータベースがすでに存在することをユーザーに通知します。 このコマンドでは、DATABASEの代わりにSCHEMAを使用できます。 次のクエリを実行して、 userdb という名前のデータベースを作成します。

hive> CREATE DATABASE [IF NOT EXISTS] userdb;

or

hive> CREATE SCHEMA userdb;

データベースリストを確認するには、次のクエリを使用します。

hive> SHOW DATABASES;
default
userdb

JDBCプログラム

データベースを作成するJDBCプログラムを以下に示します。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveCreateDb {
   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {
     //Register driver and create driver instance

      Class.forName(driverName);
     //get connection

      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");
      Statement stmt = con.createStatement();

      stmt.executeQuery("CREATE DATABASE userdb");
      System.out.println(“Database userdb created successfully.”);

      con.close();
   }
}

HiveCreateDb.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveCreateDb.java
$ java HiveCreateDb

出力:

Database userdb created successfully.

Hive-データベースの削除

この章では、Hiveでデータベースを削除する方法について説明します。 SCHEMAとDATABASEの使用法は同じです。

データベース文の削除

データベースの削除は、すべてのテーブルを削除し、データベースを削除するステートメントです。 その構文は次のとおりです。

DROP DATABASE StatementDROP (DATABASE|SCHEMA) [IF EXISTS] database_name
[RESTRICT|CASCADE];

データベースを削除するには、次のクエリを使用します。 データベース名が userdb であると仮定しましょう。

hive> DROP DATABASE IF EXISTS userdb;

次のクエリは、 CASCADE を使用してデータベースを削除します。 データベースを削除する前にそれぞれのテーブルを削除することを意味します。

hive> DROP DATABASE IF EXISTS userdb CASCADE;

次のクエリは、 SCHEMA を使用してデータベースを削除します。

hive> DROP SCHEMA userdb;

この句はHive 0.6で追加されました。

JDBCプログラム

データベースを削除するJDBCプログラムを以下に示します。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveDropDb {
   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");
      Statement stmt = con.createStatement();
      stmt.executeQuery("DROP DATABASE userdb");

      System.out.println(“Drop userdb database successful.”);

      con.close();
   }
}

HiveDropDb.javaという名前のファイルにプログラムを保存します。 以下に、このプログラムをコンパイルして実行するコマンドを示します。

$ javac HiveDropDb.java
$ java HiveDropDb

出力:

Drop userdb database successful.

ハイブ-テーブルの作成

この章では、テーブルの作成方法とデータの挿入方法について説明します。 HIVEでテーブルを作成する規則は、SQLを使用してテーブルを作成することに非常に似ています。

テーブルステートメントの作成

Create Tableは、Hiveでテーブルを作成するために使用されるステートメントです。 構文と例は次のとおりです。

構文

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name

[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]

*CREATE TABLE* ステートメントを使用して *employee* という名前のテーブルを作成する必要があると仮定します。 次の表に、従業員テーブルのフィールドとそのデータ型を示します。
Sr.No Field Name Data Type
1 Eid int
2 Name String
3 Salary Float
4 Designation string

以下のデータは、コメント、フィールドターミネーター、行ターミネーター、保存ファイルタイプなどの行形式のフィールドです。

COMMENT ‘Employee details’
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED IN TEXT FILE

次のクエリは、上記のデータを使用して employee という名前のテーブルを作成します。

hive> CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
salary String, destination String)
COMMENT ‘Employee details’
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED AS TEXTFILE;

IF NOT EXISTSオプションを追加すると、テーブルが既に存在する場合、Hiveはステートメントを無視します。

テーブルが正常に作成されると、次の応答が表示されます。

OK
Time taken: 5.905 seconds
hive>

JDBCプログラム

テーブルを作成するJDBCプログラムの例を示します。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveCreateTable {
   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/userdb", "", "");

     //create statement
      Statement stmt = con.createStatement();

     //execute statement
      stmt.executeQuery("CREATE TABLE IF NOT EXISTS "
         +" employee ( eid int, name String, "
         +" salary String, destignation String)"
         +" COMMENT ‘Employee details’"
         +" ROW FORMAT DELIMITED"
         +" FIELDS TERMINATED BY ‘\t’"
         +" LINES TERMINATED BY ‘\n’"
         +" STORED AS TEXTFILE;");

      System.out.println(“ Table employee created.”);
      con.close();
   }
}

HiveCreateDb.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveCreateDb.java
$ java HiveCreateDb

出力

Table employee created.

データの読み込みステートメント

一般に、SQLでテーブルを作成した後、Insertステートメントを使用してデータを挿入できます。 しかし、Hiveでは、LOAD DATAステートメントを使用してデータを挿入できます。

Hiveにデータを挿入する際、LOAD DATAを使用してバルクレコードを保存することをお勧めします。 データをロードするには2つの方法があります。1つはローカルファイルシステムから、もう1つはHadoopファイルシステムからです。

構文

ロードデータの構文は次のとおりです。

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
  • LOCALは、ローカルパスを指定する識別子です。 オプションです。
  • OVERWRITEは、テーブル内のデータを上書きするためのオプションです。
  • PARTITIONはオプションです。

次のデータをテーブルに挿入します。 これは、 /home/user ディレクトリにある sample.txt という名前のテキストファイルです。

1201  Gopal       45000    Technical manager
1202  Manisha     45000    Proof reader
1203  Masthanvali 40000    Technical writer
1204  Kiran       40000    Hr Admin
1205  Kranthi     30000    Op Admin

次のクエリは、指定されたテキストをテーブルにロードします。

hive> LOAD DATA LOCAL INPATH '/home/user/sample.txt'
OVERWRITE INTO TABLE employee;

ダウンロードが成功すると、次の応答が表示されます。

OK
Time taken: 15.905 seconds
hive>

JDBCプログラム

以下に、指定されたデータをテーブルにロードするJDBCプログラムを示します。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveLoadData {

   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/userdb", "", "");

     //create statement
      Statement stmt = con.createStatement();

     //execute statement
      stmt.executeQuery("LOAD DATA LOCAL INPATH '/home/user/sample.txt'" + "OVERWRITE INTO TABLE employee;");
      System.out.println("Load Data into employee successful");

      con.close();
   }
}

HiveLoadData.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveLoadData.java
$ java HiveLoadData

出力:

Load Data into employee successful

ハイブ-テーブルの変更

この章では、テーブル名の変更、列名の変更、列の追加、列の削除または置換など、表の属性を変更する方法について説明します。

テーブルの変更ステートメント

Hiveのテーブルを変更するために使用されます。

構文

このステートメントは、テーブル内で変更する属性に基づいて、次の構文のいずれかを使用します。

ALTER TABLE name RENAME TO new_name
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])

名前を変更…ステートメント

次のクエリは、テーブルの名前を employee から emp に変更します。

hive> ALTER TABLE employee RENAME TO emp;

JDBCプログラム

テーブルの名前を変更するJDBCプログラムは次のとおりです。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveAlterRenameTo {
   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/userdb", "", "");

     //create statement
      Statement stmt = con.createStatement();

     //execute statement
      stmt.executeQuery("ALTER TABLE employee RENAME TO emp;");
      System.out.println("Table Renamed Successfully");
      con.close();
   }
}

HiveAlterRenameTo.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveAlterRenameTo.java
$ java HiveAlterRenameTo

出力:

Table renamed successfully.

変更ステートメント

次の表には、 employee テーブルのフィールドが含まれており、変更するフィールドを太字で示しています。

Field Name Convert from Data Type Change Field Name Convert to Data Type
eid int eid int
name String ename String
salary Float salary Double
designation String designation String

次のクエリは、上記のデータを使用して列名と列データ型の名前を変更します。

hive> ALTER TABLE employee CHANGE name ename String;
hive> ALTER TABLE employee CHANGE salary salary Double;

JDBCプログラム

以下に、列を変更するJDBCプログラムを示します。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveAlterChangeColumn {
   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/userdb", "", "");

     //create statement
      Statement stmt = con.createStatement();

     //execute statement
      stmt.executeQuery("ALTER TABLE employee CHANGE name ename String;");
      stmt.executeQuery("ALTER TABLE employee CHANGE salary salary Double;");

      System.out.println("Change column successful.");
      con.close();
   }
}

HiveAlterChangeColumn.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveAlterChangeColumn.java
$ java HiveAlterChangeColumn

出力:

Change column successful.

列ステートメントの追加

次のクエリは、従業員テーブルにdeptという名前の列を追加します。

hive> ALTER TABLE employee ADD COLUMNS (
dept STRING COMMENT 'Department name');

JDBCプログラム

テーブルに列を追加するJDBCプログラムを以下に示します。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveAlterAddColumn {
   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/userdb", "", "");

     //create statement
      Statement stmt = con.createStatement();

     //execute statement
      stmt.executeQuery("ALTER TABLE employee ADD COLUMNS " + " (dept STRING COMMENT 'Department name');");
      System.out.prinln("Add column successful.");

      con.close();
   }
}

HiveAlterAddColumn.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveAlterAddColumn.java
$ java HiveAlterAddColumn

出力:

Add column successful.

置換ステートメント

次のクエリは、 employee テーブルからすべての列を削除し、 emp および name 列に置き換えます。

hive> ALTER TABLE employee REPLACE COLUMNS (
eid INT empid Int,
ename STRING name String);

JDBCプログラム

以下に示すのは、 eid 列を empid に、 ename 列を name に置き換えるJDBCプログラムです。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveAlterReplaceColumn {

   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/userdb", "", "");

     //create statement
      Statement stmt = con.createStatement();

     //execute statement
      stmt.executeQuery("ALTER TABLE employee REPLACE COLUMNS "
         +" (eid INT empid Int,"
         +" ename STRING name String);");

      System.out.println(" Replace column successful");
      con.close();
   }
}

HiveAlterReplaceColumn.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveAlterReplaceColumn.java
$ java HiveAlterReplaceColumn

出力:

Replace column successful.

ハイブ-ドロップテーブル

この章では、Hiveでテーブルを削除する方法について説明します。 Hive Metastoreからテーブルを削除すると、テーブル/列のデータとそのメタデータが削除されます。 通常のテーブル(メタストアに格納されている)または外部テーブル(ローカルファイルシステムに格納されている)です。 Hiveは、タイプに関係なく、両方を同じように扱います。

テーブルステートメントの削除

構文は次のとおりです。

DROP TABLE [IF EXISTS] table_name;

次のクエリは、 employee という名前のテーブルを削除します。

hive> DROP TABLE IF EXISTS employee;

クエリが正常に実行されると、次の応答が表示されます。

OK
Time taken: 5.3 seconds
hive>

JDBCプログラム

次のJDBCプログラムは、従業員テーブルを削除します。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveDropTable {

   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/userdb", "", "");

     //create statement
      Statement stmt = con.createStatement();

     //execute statement
      stmt.executeQuery("DROP TABLE IF EXISTS employee;");
      System.out.println("Drop table successful.");

      con.close();
   }
}

HiveDropTable.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveDropTable.java
$ java HiveDropTable

出力:

Drop table successful

次のクエリを使用して、テーブルのリストを確認します。

hive> SHOW TABLES;
emp
ok
Time taken: 2.1 seconds
hive>

Hive-パーティショニング

Hiveはテーブルをパーティションに編成します。 これは、日付、都市、部門などのパーティション化された列の値に基づいて、テーブルを関連部分に分割する方法です。 パーティションを使用すると、データの一部を簡単に照会できます。

テーブルまたはパーティションは*バケット*に細分され、より効率的なクエリに使用できるデータに追加の構造を提供します。 バケットは、テーブルの列のハッシュ関数の値に基づいて機能します。

たとえば、 Tab1 という名前のテーブルには、id、name、dept、yoj(参加年)などの従業員データが含まれます。 2012年に参加したすべての従業員の詳細を取得する必要があるとします。 クエリは、テーブル全体から必要な情報を検索します。 ただし、従業員データを年で分割し、別のファイルに保存すると、クエリの処理時間が短縮されます。 次の例は、ファイルとそのデータをパーティション分割する方法を示しています。

次のファイルには、employeedataテーブルが含まれています。

/tab1/employeedata/file1

id, name, dept, yoj
1, gopal, TP, 2012
2, kiran, HR, 2012
3, kaleel,SC, 2013
4, Prasanth, SC, 2013

上記のデータは、年を使用して2つのファイルに分割されます。

/tab1/employeedata/2012/file2

1, gopal, TP, 2012
2, kiran, HR, 2012

/tab1/employeedata/2013/file3

3, kaleel,SC, 2013
4, Prasanth, SC, 2013

パーティションを追加する

テーブルを変更することで、テーブルにパーティションを追加できます。 Id、Name、Salary、Designation、Dept、yojなどのフィールドを持つ employee というテーブルがあると仮定します。

構文:

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec
[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;

partition_spec:
: (p_column = p_col_value, p_column = p_col_value, ...)

次のクエリは、従業員テーブルにパーティションを追加するために使用されます。

hive> ALTER TABLE employee
> ADD PARTITION (year=’2012’)
> location '/2012/part2012';

パーティションの名前を変更する

このコマンドの構文は次のとおりです。

ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;

パーティションの名前を変更するには、次のクエリを使用します。

hive> ALTER TABLE employee PARTITION (year=’1203’)
   > RENAME TO PARTITION (Yoj=’1203’);

パーティションの削除

パーティションを削除するには、次の構文を使用します。

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec, PARTITION partition_spec,...;

パーティションを削除するには、次のクエリを使用します。

hive> ALTER TABLE employee DROP [IF EXISTS]
   > PARTITION (year=’1203’);

Hive-組み込み演算子

この章では、Hiveの組み込み演算子について説明します。 Hiveには4種類の演算子があります。

  • 関係演算子
  • 算術演算子
  • 論理演算子
  • 複雑な演算子

関係演算子

これらの演算子は、2つのオペランドを比較するために使用されます。 次の表に、Hiveで使用可能な関係演算子を示します。

Operator Operand Description
A = B all primitive types TRUE if expression A is equivalent to expression B otherwise FALSE.
A != B all primitive types TRUE if expression A is not equivalent to expression B otherwise FALSE.
A < B all primitive types TRUE if expression A is less than expression B otherwise FALSE.
A ⇐ B all primitive types TRUE if expression A is less than or equal to expression B otherwise FALSE.
A > B all primitive types TRUE if expression A is greater than expression B otherwise FALSE.
A >= B all primitive types TRUE if expression A is greater than or equal to expression B otherwise FALSE.
A IS NULL all types TRUE if expression A evaluates to NULL otherwise FALSE.
A IS NOT NULL all types FALSE if expression A evaluates to NULL otherwise TRUE.
A LIKE B Strings TRUE if string pattern A matches to B otherwise FALSE.
A RLIKE B Strings NULL if A or B is NULL, TRUE if any substring of A matches the Java regular expression B , otherwise FALSE.
A REGEXP B Strings Same as RLIKE.

*employee* テーブルは、以下に示すように、Id、Name、Salary、Designation、Deptという名前のフィールドで構成されていると仮定します。 Idが1205である従業員の詳細を取得するクエリを生成します。
+-----+--------------+--------+---------------------------+------+
| Id  | Name         | Salary | Designation               | Dept |
+-----+--------------+------------------------------------+------+
|1201 | Gopal        | 45000  | Technical manager         | TP   |
|1202 | Manisha      | 45000  | Proofreader               | PR   |
|1203 | Masthanvali  | 40000  | Technical writer          | TP   |
|1204 | Krian        | 40000  | Hr Admin                  | HR   |
|1205 | Kranthi      | 30000  | Op Admin                  | Admin|
+-----+--------------+--------+---------------------------+------+

上記の表を使用して従業員の詳細を取得するために、次のクエリが実行されます。

hive> SELECT *FROM employee WHERE Id=1205;

クエリが正常に実行されると、次の応答が表示されます。

+-----+-----------+-----------+----------------------------------+
| ID  | Name      | Salary    | Designation              | Dept  |
+-----+---------------+-------+----------------------------------+
|1205 | Kranthi   | 30000     | Op Admin                 | Admin |
+-----+-----------+-----------+----------------------------------+

次のクエリを実行して、給与がRs 40000以上の従業員の詳細を取得します。

hive> SELECT* FROM employee WHERE Salary>=40000;

クエリが正常に実行されると、次の応答が表示されます。

+-----+------------+--------+----------------------------+------+
| ID  | Name       | Salary | Designation                | Dept |
+-----+------------+--------+----------------------------+------+
|1201 | Gopal      | 45000  | Technical manager          | TP   |
|1202 | Manisha    | 45000  | Proofreader                | PR   |
|1203 | Masthanvali| 40000  | Technical writer           | TP   |
|1204 | Krian      | 40000  | Hr Admin                   | HR   |
+-----+------------+--------+----------------------------+------+

算術演算子

これらの演算子は、オペランドに対するさまざまな一般的な算術演算をサポートしています。 それらはすべて数値型を返します。 次の表に、Hiveで使用できる算術演算子を示します。

Operators Operand Description
A + B all number types Gives the result of adding A and B.
A - B all number types Gives the result of subtracting B from A.
A *B all number types Gives the result of multiplying A and B.
A/B all number types Gives the result of dividing B from A.
A % B all number types Gives the reminder resulting from dividing A by B.
A & B all number types Gives the result of bitwise AND of A and B.
A B all number types
Gives the result of bitwise OR of A and B. A ^ B all number types
Gives the result of bitwise XOR of A and B. ~A all number types

次のクエリは、20と30の2つの数値を追加します。

hive> SELECT 20+30 ADD FROM temp;

クエリが正常に実行されると、次の応答が表示されます。

+--------+
|   ADD  |
+--------+
|   50   |
+--------+

論理演算子

演算子は論理式です。 それらはすべてTRUEまたはFALSEを返します。

Operators Operands Description
A AND B boolean TRUE if both A and B are TRUE, otherwise FALSE.
A && B boolean Same as A AND B.
A OR B boolean TRUE if either A or B or both are TRUE, otherwise FALSE.
A B
boolean Same as A OR B. NOT A
boolean TRUE if A is FALSE, otherwise FALSE. !A

次のクエリは、部門がTPで給与がRs 40000を超える従業員の詳細を取得するために使用されます。

hive> SELECT* FROM employee WHERE Salary>40000 && Dept=TP;

クエリが正常に実行されると、次の応答が表示されます。

+------+--------------+-------------+-------------------+--------+
| ID   | Name         | Salary      | Designation       | Dept   |
+------+--------------+-------------+-------------------+--------+
|1201  | Gopal        | 45000       | Technical manager | TP     |
+------+--------------+-------------+-------------------+--------+

複雑な演算子

これらの演算子は、複合型の要素にアクセスする式を提供します。

Operator Operand Description
A[n] A is an Array and n is an int It returns the nth element in the array A. The first element has index 0.
M[key] M is a Map<K, V> and key has type K It returns the value corresponding to the key in the map.
S.x S is a struct It returns the x field of S.

Hive-組み込み関数

この章では、Hiveで使用可能な組み込み関数について説明します。 関数は、使用方法を除いて、SQL関数と非常によく似ています。

組み込み関数

Hiveは次の組み込み関数をサポートしています。

戻りタイプ

署名

説明

BIGINT

ラウンド(ダブルA)

doubleの丸められたBIGINT値を返します。

BIGINT

床(ダブルA)

double以下の最大BIGINT値を返します。

BIGINT

ceil(ダブルa)

double以上の最小BIGINT値を返します。

ダブル

rand()、rand(int seed)

行ごとに変化する乱数を返します。

ひも

concat(string A、string B、…​)

Aの後にBを連結した結果の文字列を返します。

ひも

substr(string A、int start)

開始位置から文字列Aの終わりまでAの部分文字列を返します。

ひも

substr(string A、int start、int length)

指定された長さの開始位置から始まるAの部分文字列を返します。

ひも

アッパー(文字列A)

Aのすべての文字を大文字に変換した結果の文字列を返します。

ひも

ucase(string A)

同上。

ひも

低い(文字列A)

Bのすべての文字を小文字に変換した結果の文字列を返します。

ひも

lcase(文字列A)

同上。

ひも

トリム(文字列A)

Aの両端からスペースをトリミングした結果の文字列を返します。

ひも

ltrim(文字列A)

Aの先頭(左側)からスペースをトリミングした結果の文字列を返します。

ひも

rtrim(文字列A)

rtrim(string A)Aの末尾(右側)からスペースをトリミングした結果の文字列を返します。

ひも

regexp_replace(文字列A、文字列B、文字列C)

Javaの正規表現構文に一致するBのすべての部分文字列をCに置き換えた結果の文字列を返します。

int

サイズ(Map <K.V>)

マップタイプの要素の数を返します。

int

サイズ(配列<T>)

配列型の要素数を返します。

<type>の値

cast(<expr> as <type>)

式exprの結果を<type>に変換します。 cast( '1' as BIGINT)は、文字列 '1’を整数表現に変換します。 変換が成功しない場合、NULLが返されます。

ひも

from_unixtime(int unixtime)

Unixエポック(1970-01-01 00:00:00 UTC)からの秒数を、「1970-01-01 00:00」の形式で現在のシステムタイムゾーンのその時点のタイムスタンプを表す文字列に変換します。 00 "

ひも

to_date(string timestamp)

タイムスタンプ文字列の日付部分を返します:to_date( "1970-01-01 00:00:00")= "1970-01-01"

int

年(文字列日付)

日付の年の部分またはタイムスタンプ文字列を返します:year( "1970-01-01 00:00:00")= 1970、year( "1970-01-01")= 1970

int

月(文字列の日付)

日付の月の部分またはタイムスタンプ文字列を返します:month( "1970-11-01 00:00:00")= 11、month( "1970-11-01")= 11

int

日(文字列日付)

日付の日付部分またはタイムスタンプ文字列を返します:day( "1970-11-01 00:00:00")= 1、day( "1970-11-01")= 1

ひも

get_json_object(string json_string、string path)

指定されたjsonパスに基づいてjson文字列からjsonオブジェクトを抽出し、抽出されたjsonオブジェクトのjson文字列を返します。 入力json文字列が無効な場合は、NULLを返します。

次のクエリは、いくつかの組み込み関数を示しています。

round()関数

hive> SELECT round(2.6) from temp;

クエリが正常に実行されると、次の応答が表示されます。

3.0

floor()関数

hive> SELECT floor(2.6) from temp;

クエリが正常に実行されると、次の応答が表示されます。

2.0

ceil()関数

hive> SELECT ceil(2.6) from temp;

クエリが正常に実行されると、次の応答が表示されます。

3.0

集約関数

Hiveは、次の組み込み*集計関数*をサポートしています。 これらの関数の使用法は、SQL集約関数と同じです。

Return Type Signature Description
BIGINT count(*), count(expr), count(*) - Returns the total number of retrieved rows.
DOUBLE sum(col), sum(DISTINCT col) It returns the sum of the elements in the group or the sum of the distinct values of the column in the group.
DOUBLE avg(col), avg(DISTINCT col) It returns the average of the elements in the group or the average of the distinct values of the column in the group.
DOUBLE min(col) It returns the minimum value of the column in the group.
DOUBLE max(col) It returns the maximum value of the column in the group.

Hive-ビューとインデックス

この章では、ビューを作成および管理する方法について説明します。 ビューは、ユーザーの要件に基づいて生成されます。 結果セットのデータはすべてビューとして保存できます。 Hiveのビューの使用法は、SQLのビューの使用法と同じです。 これは標準のRDBMSコンセプトです。 ビューですべてのDML操作を実行できます。

ビューを作成する

SELECTステートメントの実行時にビューを作成できます。 構文は次のとおりです。

CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT table_comment]
AS SELECT ...

例を見てみましょう。 Id、Name、Salary、Designation、Deptの各フィールドを持つ従業員テーブルを以下のように想定します。 Rs 30000を超える給与を稼ぐ従業員の詳細を取得するクエリを生成します。 結果を* emp_30000。*という名前のビューに保存します

+------+--------------+-------------+-------------------+--------+
| ID   | Name         | Salary      | Designation       | Dept   |
+------+--------------+-------------+-------------------+--------+
|1201  | Gopal        | 45000       | Technical manager | TP     |
|1202  | Manisha      | 45000       | Proofreader       | PR     |
|1203  | Masthanvali  | 40000       | Technical writer  | TP     |
|1204  | Krian        | 40000       | Hr Admin          | HR     |
|1205  | Kranthi      | 30000       | Op Admin          | Admin  |
+------+--------------+-------------+-------------------+--------+

次のクエリは、上記のシナリオを使用して従業員の詳細を取得します。

hive> CREATE VIEW emp_30000 AS
SELECT * FROM employee
WHERE salary>30000;

ビューを削除する

ビューを削除するには、次の構文を使用します。

DROP VIEW view_name

次のクエリは、emp_30000という名前のビューを削除します。

hive> DROP VIEW emp_30000;

インデックスを作成する

インデックスは、テーブルの特定の列へのポインタにすぎません。 インデックスの作成とは、テーブルの特定の列にポインターを作成することを意味します。 その構文は次のとおりです。

CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)]
[
   [ ROW FORMAT ...] STORED AS ...
   | STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]

インデックスの例を見てみましょう。 Id、Name、Salary、Designation、Deptの各フィールドで以前に使用したのと同じ従業員テーブルを使用します。 employeeテーブルのsalary列にindex_salaryという名前のインデックスを作成します。

次のクエリはインデックスを作成します。

hive> CREATE INDEX inedx_salary ON TABLE employee(salary)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';

これは、給与列へのポインタです。 列が変更された場合、変更はインデックス値を使用して保存されます。

インデックスの削除

インデックスを削除するには、次の構文を使用します。

DROP INDEX <index_name> ON <table_name>

次のクエリは、index_salaryという名前のインデックスを削除します。

hive> DROP INDEX index_salary ON employee;

HiveQL-Select-Where

Hiveクエリ言語(HiveQL)は、Hiveがメタストア内の構造化データを処理および分析するためのクエリ言語です。 この章では、WHERE句を指定したSELECTステートメントの使用方法について説明します。

SELECTステートメントは、テーブルからデータを取得するために使用されます。 WHERE句は条件と同様に機能します。 条件を使用してデータをフィルタリングし、有限の結果を提供します。 組み込みの演算子と関数は、条件を満たす式を生成します。

構文

以下に、SELECTクエリの構文を示します。

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[LIMIT number];

SELECT…WHERE句の例を見てみましょう。 Id、Name、Salary、Designation、Deptという名前のフィールドを持つ、以下の従業員テーブルがあるとします。 Rs 30000を超える給与を稼ぐ従業員の詳細を取得するクエリを生成します。

+------+--------------+-------------+-------------------+--------+
| ID   | Name         | Salary      | Designation       | Dept   |
+------+--------------+-------------+-------------------+--------+
|1201  | Gopal        | 45000       | Technical manager | TP     |
|1202  | Manisha      | 45000       | Proofreader       | PR     |
|1203  | Masthanvali  | 40000       | Technical writer  | TP     |
|1204  | Krian        | 40000       | Hr Admin          | HR     |
|1205  | Kranthi      | 30000       | Op Admin          | Admin  |
+------+--------------+-------------+-------------------+--------+

次のクエリは、上記のシナリオを使用して従業員の詳細を取得します。

hive> SELECT *FROM employee WHERE salary>30000;

クエリが正常に実行されると、次の応答が表示されます。

+------+--------------+-------------+-------------------+--------+
| ID   | Name         | Salary      | Designation       | Dept   |
+------+--------------+-------------+-------------------+--------+
|1201  | Gopal        | 45000       | Technical manager | TP     |
|1202  | Manisha      | 45000       | Proofreader       | PR     |
|1203  | Masthanvali  | 40000       | Technical writer  | TP     |
|1204  | Krian        | 40000       | Hr Admin          | HR     |
+------+--------------+-------------+-------------------+--------+

JDBCプログラム

特定の例にwhere句を適用するJDBCプログラムは次のとおりです。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveQLWhere {
   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/userdb", "", "");

     //create statement
      Statement stmt = con.createStatement();

     //execute statement
      Resultset res = stmt.executeQuery("SELECT* FROM employee WHERE salary>30000;");

      System.out.println("Result:");
      System.out.println(" ID \t Name \t Salary \t Designation \t Dept ");

      while (res.next()) {
         System.out.println(res.getInt(1) + " " + res.getString(2) + " " + res.getDouble(3) + " " + res.getString(4) + " " + res.getString(5));
      }
      con.close();
   }
}

HiveQLWhere.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveQLWhere.java
$ java HiveQLWhere

出力:

ID       Name           Salary      Designation          Dept
1201     Gopal          45000       Technical manager    TP
1202     Manisha        45000       Proofreader          PR
1203     Masthanvali    40000       Technical writer     TP
1204     Krian          40000       Hr Admin             HR

HiveQL-選択順

この章では、SELECTステートメントでORDER BY句を使用する方法について説明します。 ORDER BY句を使用して、1つの列に基づいて詳細を取得し、昇順または降順で結果セットを並べ替えます。

構文

以下に、ORDER BY句の構文を示します。

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[ORDER BY col_list]]
[LIMIT number];

SELECT …​ ORDER BY句の例を見てみましょう。 Id、Name、Salary、Designation、およびDeptという名前のフィールドを持つ従業員テーブルを以下のように想定します。 部門名を使用して、従業員の詳細を順番に取得するクエリを生成します。

+------+--------------+-------------+-------------------+--------+
| ID   | Name         | Salary      | Designation       | Dept   |
+------+--------------+-------------+-------------------+--------+
|1201  | Gopal        | 45000       | Technical manager | TP     |
|1202  | Manisha      | 45000       | Proofreader       | PR     |
|1203  | Masthanvali  | 40000       | Technical writer  | TP     |
|1204  | Krian        | 40000       | Hr Admin          | HR     |
|1205  | Kranthi      | 30000       | Op Admin          | Admin  |
+------+--------------+-------------+-------------------+--------+

次のクエリは、上記のシナリオを使用して従業員の詳細を取得します。

hive> SELECT Id, Name, Dept FROM employee ORDER BY DEPT;

クエリが正常に実行されると、次の応答が表示されます。

+------+--------------+-------------+-------------------+--------+
| ID   | Name         | Salary      | Designation       | Dept   |
+------+--------------+-------------+-------------------+--------+
|1205  | Kranthi      | 30000       | Op Admin          | Admin  |
|1204  | Krian        | 40000       | Hr Admin          | HR     |
|1202  | Manisha      | 45000       | Proofreader       | PR     |
|1201  | Gopal        | 45000       | Technical manager | TP     |
|1203  | Masthanvali  | 40000       | Technical writer  | TP     |
+------+--------------+-------------+-------------------+--------+

JDBCプログラム

次に、指定された例にOrder By句を適用するJDBCプログラムを示します。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveQLOrderBy {
   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/userdb", "", "");

     //create statement
      Statement stmt = con.createStatement();

     //execute statement
      Resultset res = stmt.executeQuery("SELECT * FROM employee ORDER BY DEPT;");
      System.out.println(" ID \t Name \t Salary \t Designation \t Dept ");

      while (res.next()) {
         System.out.println(res.getInt(1) + " " + res.getString(2) + " " + res.getDouble(3) + " " + res.getString(4) + " " + res.getString(5));
      }

      con.close();
   }
}

HiveQLOrderBy.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveQLOrderBy.java
$ java HiveQLOrderBy

出力:

ID       Name           Salary      Designation          Dept
1205     Kranthi        30000       Op Admin             Admin
1204     Krian          40000       Hr Admin             HR
1202     Manisha        45000       Proofreader          PR
1201     Gopal          45000       Technical manager    TP
1203     Masthanvali    40000       Technical writer     TP
1204     Krian          40000       Hr Admin             HR

HiveQL-選択グループ

この章では、SELECTステートメントのGROUP BY句の詳細について説明します。 GROUP BY句は、特定のコレクション列を使用して結果セット内のすべてのレコードをグループ化するために使用されます。 レコードのグループを照会するために使用されます。

構文

GROUP BY句の構文は次のとおりです。

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[ORDER BY col_list]]
[LIMIT number];

SELECT…GROUP BY句の例を見てみましょう。 Id、Name、Salary、Designation、およびDeptフィールドを持つ従業員テーブルを以下のように想定します。 各部門の従業員数を取得するクエリを生成します。

+------+--------------+-------------+-------------------+--------+
| ID   | Name         | Salary      | Designation       | Dept   |
+------+--------------+-------------+-------------------+--------+
|1201  | Gopal        | 45000       | Technical manager | TP     |
|1202  | Manisha      | 45000       | Proofreader       | PR     |
|1203  | Masthanvali  | 40000       | Technical writer  | TP     |
|1204  | Krian        | 45000       | Proofreader       | PR     |
|1205  | Kranthi      | 30000       | Op Admin          | Admin  |
+------+--------------+-------------+-------------------+--------+

次のクエリは、上記のシナリオを使用して従業員の詳細を取得します。

hive> SELECT Dept,count(*) FROM employee GROUP BY DEPT;

クエリが正常に実行されると、次の応答が表示されます。

+------+--------------+
| Dept | Count(*)     |
+------+--------------+
|Admin |    1         |
|PR    |    2         |
|TP    |    3         |
+------+--------------+

JDBCプログラム

以下に示すのは、特定の例にGroup By句を適用するJDBCプログラムです。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveQLGroupBy {
   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

   public static void main(String[] args) throws SQLException {

     //Register driver and create driver instance
      Class.forName(driverName);

     //get connection
      Connection con = DriverManager.
      getConnection("jdbc:hive://localhost:10000/userdb", "", "");

     //create statement
      Statement stmt = con.createStatement();

     //execute statement
      Resultset res = stmt.executeQuery(“SELECT Dept,count(*) ” + “FROM employee GROUP BY DEPT; ”);
      System.out.println(" Dept \t count(*)");

      while (res.next()) {
         System.out.println(res.getString(1) + " " + res.getInt(2));
      }
      con.close();
   }
}

HiveQLGroupBy.javaという名前のファイルにプログラムを保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。

$ javac HiveQLGroupBy.java
$ java HiveQLGroupBy

出力:

 Dept     Count(*)
 Admin       1
 PR          2
 TP          3

HiveQL-選択-結合

JOINは、各テーブルに共通の値を使用して2つのテーブルの特定のフィールドを結合するために使用される句です。 データベース内の2つ以上のテーブルのレコードを結合するために使用されます。

構文

join_table:

   table_reference JOIN table_factor [join_condition]
   | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference
   join_condition
   | table_reference LEFT SEMI JOIN table_reference join_condition
   | table_reference CROSS JOIN table_reference [join_condition]

この章では、次の2つの表を使用します。 CUSTOMERS。という名前の次の表を検討してください。

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
| 1  | Ramesh   | 32  | Ahmedabad | 2000.00  |
| 2  | Khilan   | 25  | Delhi     | 1500.00  |
| 3  | kaushik  | 23  | Kota      | 2000.00  |
| 4  | Chaitali | 25  | Mumbai    | 6500.00  |
| 5  | Hardik   | 27  | Bhopal    | 8500.00  |
| 6  | Komal    | 22  | MP        | 4500.00  |
| 7  | Muffy    | 24  | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

次のように別のテーブルORDERSを検討します。

+-----+---------------------+-------------+--------+
|OID  | DATE                | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 | 3000   |
| 100 | 2009-10-08 00:00:00 |           3 | 1500   |
| 101 | 2009-11-20 00:00:00 |           2 | 1560   |
| 103 | 2008-05-20 00:00:00 |           4 | 2060   |
+-----+---------------------+-------------+--------+

次のようなさまざまなタイプの結合があります。

  • JOIN
  • 左外部結合
  • 右アウタージョイン
  • フルアウタージョイン

JOIN

JOIN句は、複数のテーブルからレコードを結合および取得するために使用されます。 JOINは、SQLのOUTER JOINと同じです。 JOIN条件は、テーブルの主キーと外部キーを使用して発生します。

次のクエリは、CUSTOMERテーブルとORDERテーブルでJOINを実行し、レコードを取得します。

hive> SELECT c.ID, c.NAME, c.AGE, o.AMOUNT
FROM CUSTOMERS c JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);

クエリが正常に実行されると、次の応答が表示されます。

+----+----------+-----+--------+
| ID | NAME     | AGE | AMOUNT |
+----+----------+-----+--------+
| 3  | kaushik  | 23  | 3000   |
| 3  | kaushik  | 23  | 1500   |
| 2  | Khilan   | 25  | 1560   |
| 4  | Chaitali | 25  | 2060   |
+----+----------+-----+--------+

左外部結合

HiveQL LEFT OUTER JOINは、右側のテーブルに一致するものがない場合でも、左側のテーブルのすべての行を返します。 つまり、ON句が右側のテーブルの0(ゼロ)レコードと一致する場合、JOINは結果に行を返しますが、右側のテーブルの各列にはNULLを返します。

LEFT JOINは、左側のテーブルのすべての値と、右側のテーブルの一致した値を返します。一致するJOIN述語がない場合はNULLを返します。

次のクエリは、CUSTOMERテーブルとORDERテーブル間のLEFT OUTER JOINを示しています。

hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
LEFT OUTER JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);

クエリが正常に実行されると、次の応答が表示されます。

+----+----------+--------+---------------------+
| ID | NAME     | AMOUNT | DATE                |
+----+----------+--------+---------------------+
| 1  | Ramesh   | NULL   | NULL                |
| 2  | Khilan   | 1560   | 2009-11-20 00:00:00 |
| 3  | kaushik  | 3000   | 2009-10-08 00:00:00 |
| 3  | kaushik  | 1500   | 2009-10-08 00:00:00 |
| 4  | Chaitali | 2060   | 2008-05-20 00:00:00 |
| 5  | Hardik   | NULL   | NULL                |
| 6  | Komal    | NULL   | NULL                |
| 7  | Muffy    | NULL   | NULL                |
+----+----------+--------+---------------------+

右アウタージョイン

HiveQL RIGHT OUTER JOINは、左のテーブルに一致するものがない場合でも、右のテーブルからすべての行を返します。 ON句が左側のテーブルの0(ゼロ)レコードと一致する場合、JOINは結果に行を返しますが、左側のテーブルの各列にはNULLを返します。

RIGHT JOINは、右側のテーブルのすべての値と、左側のテーブルの一致した値を返します。一致する結合述語がない場合はNULLを返します。

次のクエリは、CUSTOMERテーブルとORDERテーブル間のRIGHT OUTER JOINを示しています。

クエリが正常に実行されると、次の応答が表示されます。

+------+----------+--------+---------------------+
| ID   | NAME     | AMOUNT | DATE                |
+------+----------+--------+---------------------+
| 3    | kaushik  | 3000   | 2009-10-08 00:00:00 |
| 3    | kaushik  | 1500   | 2009-10-08 00:00:00 |
| 2    | Khilan   | 1560   | 2009-11-20 00:00:00 |
| 4    | Chaitali | 2060   | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+

フルアウタージョイン

HiveQL FULL OUTER JOINは、JOIN条件を満たす、左右の外側のテーブルのレコードを結合します。 結合されたテーブルには、両方のテーブルのすべてのレコードが含まれているか、どちらかの側で欠落している一致に対してNULL値が入力されます。

次のクエリは、CUSTOMERテーブルとORDERテーブル間のFULL OUTER JOINを示しています。

hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE
FROM CUSTOMERS c
FULL OUTER JOIN ORDERS o
ON (c.ID = o.CUSTOMER_ID);

クエリが正常に実行されると、次の応答が表示されます。

+------+----------+--------+---------------------+
| ID   | NAME     | AMOUNT | DATE                |
+------+----------+--------+---------------------+
| 1    | Ramesh   | NULL   | NULL                |
| 2    | Khilan   | 1560   | 2009-11-20 00:00:00 |
| 3    | kaushik  | 3000   | 2009-10-08 00:00:00 |
| 3    | kaushik  | 1500   | 2009-10-08 00:00:00 |
| 4    | Chaitali | 2060   | 2008-05-20 00:00:00 |
| 5    | Hardik   | NULL   | NULL                |
| 6    | Komal    | NULL   | NULL                |
| 7    | Muffy    | NULL   | NULL                |
| 3    | kaushik  | 3000   | 2009-10-08 00:00:00 |
| 3    | kaushik  | 1500   | 2009-10-08 00:00:00 |
| 2    | Khilan   | 1560   | 2009-11-20 00:00:00 |
| 4    | Chaitali | 2060   | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+

Hive-questions-answers