Apache-tajo-quick-guide
Apache Tajo-はじめに
分散データウェアハウスシステム
データウェアハウスは、トランザクション処理ではなくクエリと分析用に設計されたリレーショナルデータベースです。 これは、サブジェクト指向の統合された時変データの不揮発性コレクションです。 このデータは、アナリストが組織内で情報に基づいた意思決定を行うのに役立ちますが、リレーショナルデータの量は日々増加しています。
課題を克服するために、分散データウェアハウスシステムは、オンライン分析処理(OLAP)を目的として、複数のデータリポジトリ間でデータを共有します。 各データウェアハウスは、1つ以上の組織に属する場合があります。 ロードバランシングとスケーラビリティを実行します。 メタデータは複製され、一元的に配布されます。
Apache Tajoは、Hadoop分散ファイルシステム(HDFS)をストレージレイヤーとして使用し、MapReduceフレームワークの代わりに独自のクエリ実行エンジンを備えた分散データウェアハウスシステムです。
HadoopでのSQLの概要
Hadoopは、分散環境でビッグデータを保存および処理できるオープンソースのフレームワークです。 非常に高速で強力です。 ただし、Hadoopのクエリ機能は限られているため、HadoopのSQLを使用してパフォーマンスをさらに向上させることができます。 これにより、ユーザーは簡単なSQLコマンドを使用してHadoopと対話できます。
HadoopアプリケーションでのSQLの例には、Hive、Impala、Drill、Presto、Spark、HAWQ、Apache Tajoなどがあります。
Apache Tajoとは
Apache Tajoは、リレーショナルおよび分散データ処理フレームワークです。 低遅延でスケーラブルなアドホッククエリ分析用に設計されています。
- Tajoは、標準SQLおよびさまざまなデータ形式をサポートしています。 ほとんどのTajoクエリは、変更することなく実行できます。
- Tajoは、失敗したタスクと拡張可能なクエリ書き換えエンジンの再起動メカニズムにより、*フォールトトレランス*を備えています。
- Tajoは、必要な* ETL(変換およびロードプロセスの抽出)*操作を実行して、HDFSに格納されている大きなデータセットを要約します。 Hive/Pigの代替選択肢です。
Tajoの最新バージョンは、JavaプログラムおよびOracleやPostGreSQLなどのサードパーティデータベースとの接続性が向上しています。
Apache Tajoの機能
Apache Tajoには次の機能があります-
- 優れたスケーラビリティと最適化されたパフォーマンス
- 低遅延
- ユーザー定義関数
- 行/列ストレージ処理フレームワーク。
- HiveQLおよびHive MetaStoreとの互換性
- シンプルなデータフローと簡単なメンテナンス。
Apache Tajoの利点
Apache Tajoには次の利点があります-
- 使いやすい
- 簡素化されたアーキテクチャ
- コストベースのクエリ最適化
- ベクトル化されたクエリ実行計画
- 迅速な配達
- シンプルなI/Oメカニズムで、さまざまなタイプのストレージをサポートします。
- 耐障害性
Apache Tajoのユースケース
以下は、Apache Tajoの使用例の一部です-
データウェアハウジングと分析
韓国のSK Telecom会社は、1.7テラバイトのデータに対してTajoを実行し、HiveやImpalaよりも高速にクエリを完了することができることを発見しました。
データ発見
韓国の音楽ストリーミングサービスMelonは、分析処理にTajoを使用しています。 TajoはETL(extract-transform-loadプロセス)ジョブをHiveの1.5〜10倍高速に実行します。
ログ分析
韓国に本拠を置くBluehole Studioは、ファンタジーマルチプレイヤーオンラインゲームであるTERAを開発しました。 同社は、ゲームログの分析とサービス品質の中断の主な原因の発見にTajoを使用しています。
ストレージとデータ形式
Apache Tajoは次のデータ形式をサポートしています-
- JSON
- テキストファイル(CSV)
- 寄木細工
- シーケンスファイル
- AVRO
- プロトコルバッファ
- Apache Orc
Tajoは、次のストレージ形式をサポートしています-
- HDFS
- JDBC
- Amazon S3
- Apache HBase
- エラスティックサーチ
Apache Tajo-アーキテクチャ
次の図は、Apache Tajoのアーキテクチャを示しています。
次の表に、各コンポーネントの詳細を示します。
S.No. | Component & Description |
---|---|
1 |
Client
|
2 |
Master マスターはメインデーモンです。 クエリの計画を担当し、ワーカーのコーディネーターです。 |
3 |
Catalog server テーブルとインデックスの説明を維持します。 マスターデーモンに組み込まれています。 カタログサーバーは、Apache Derbyをストレージレイヤーとして使用し、JDBCクライアントを介して接続します。 |
4 |
Worker マスターノードはタスクをワーカーノードに割り当てます。 TajoWorkerはデータを処理します。 TajoWorkersの数が増えると、処理能力も直線的に増加します。 |
5 |
Query Master Tajoマスターは、クエリをクエリマスターに割り当てます。 クエリマスターは、分散実行プランの制御を担当します。 TaskRunnerを起動し、TaskRunnerにタスクをスケジュールします。 クエリマスターの主な役割は、実行中のタスクを監視し、それらをマスターノードに報告することです。 |
6 |
Node Managers ワーカーノードのリソースを管理します。 ノードへのリクエストの割り当てを決定します。 |
7 |
TaskRunner ローカルクエリ実行エンジンとして機能します。 クエリプロセスの実行と監視に使用されます。 TaskRunnerは一度に1つのタスクを処理します。 それは次の3つの主な属性を持っています-
|
8 |
クエリの実行に使用されます。 |
9 |
Storage service 基礎となるデータストレージをTajoに接続します。 |
ワークフロー
Tajoは、Hadoop分散ファイルシステム(HDFS)をストレージレイヤーとして使用し、MapReduceフレームワークの代わりに独自のクエリ実行エンジンを備えています。 Tajoクラスターは、1つのマスターノードとクラスターノード全体の多数のワーカーで構成されます。
マスターは、主にクエリの計画とワーカーのコーディネーターを担当します。 マスターはクエリを小さなタスクに分割し、ワーカーに割り当てます。 各ワーカーには、物理演算子の有向非循環グラフを実行するローカルクエリエンジンがあります。
さらに、TajoはMapReduceよりも柔軟に分散データフローを制御でき、インデックス作成技術をサポートしています。
TajoのWebベースのインターフェイスには次の機能があります-
- 送信されたクエリの計画方法を見つけるオプション
- クエリがノード間でどのように分散されているかを見つけるオプション
- クラスターとノードの状態を確認するオプション
Apache Tajo-インストール
Apache Tajoをインストールするには、システムに次のソフトウェアが必要です-
- Hadoopバージョン2.3以降
- Javaバージョン1.7以降
- LinuxまたはMac OS
Tajoをインストールするために、次の手順に進みましょう。
Javaインストールの検証
マシンにJavaバージョン8が既にインストールされていることを願っています。 今、あなたはそれを検証することで先に進む必要があります。
確認するには、次のコマンドを使用します-
$ java -version
Javaがマシンに正常にインストールされている場合、インストールされているJavaの現在のバージョンを確認できます。 Javaがインストールされていない場合は、次の手順に従ってJava 8をマシンにインストールします。
JDKをダウンロード
次のリンクにアクセスしてJDKの最新バージョンをダウンロードしてから、最新バージョンをダウンロードします。
最新バージョンは JDK 8u 92 で、ファイルは*“ jdk-8u92-linux-x64.tar.gz” *です。 マシンにファイルをダウンロードしてください。 これに続いて、ファイルを抽出し、特定のディレクトリに移動します。 次に、Javaの代替を設定します。 最後に、Javaがマシンにインストールされます。
Hadoopインストールの検証
システムにはすでに Hadoop がインストールされています。 今、次のコマンドを使用してそれを確認します-
$ hadoop version
セットアップで問題がなければ、Hadoopのバージョンを確認できます。 Hadoopがインストールされていない場合は、https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.6.2/hadoop-2.6.2.tarのリンクにアクセスして、Hadoopをダウンロードしてインストールします。 gz [https://www.apache.org]
Apache Tajoのインストール
Apache Tajoには、ローカルモードと完全分散モードの2つの実行モードがあります。 JavaとHadoopのインストールを確認したら、次の手順に進んでTajoクラスターをマシンにインストールします。 ローカルモードのTajoインスタンスには、非常に簡単な構成が必要です。
次のリンクにアクセスして、Tajoの最新バージョンをダウンロードします-https://www.apache.org/dyn/closer.cgi/tajo
これで、マシンから「* tajo-0.11.3.tar.gz」*ファイルをダウンロードできます。
Tarファイルの抽出
次のコマンドを使用してtarファイルを抽出します-
$ cd opt/
$ tar tajo-0.11.3.tar.gz
$ cd tajo-0.11.3
環境変数を設定する
- “ conf/tajo-env.sh” *ファイルに次の変更を追加します
$ cd tajo-0.11.3
$ vi conf/tajo-env.sh
# Hadoop home. Required
export HADOOP_HOME =/Users/path/to/Hadoop/hadoop-2.6.2
# The java implementation to use. Required.
export JAVA_HOME =/path/to/jdk1.8.0_92.jdk/
ここでは、HadoopとJavaパスを*“ tajo-env.sh” *ファイルに指定する必要があります。 変更が行われたら、ファイルを保存してターミナルを終了します。
Tajo Serverを起動します
Tajoサーバーを起動するには、次のコマンドを実行します-
$ bin/start-tajo.sh
次のような応答を受け取ります-
Starting single TajoMaster
starting master, logging to/Users/path/to/Tajo/tajo-0.11.3/bin/../
localhost: starting worker, logging to/Users/path/toe/Tajo/tajo-0.11.3/bin/../logs/
Tajo master web UI: http://local:26080
Tajo Client Service: local:26002
ここで、コマンド「jps」を入力して、実行中のデーモンを確認します。
$ jps
1010 TajoWorker
1140 Jps
933 TajoMaster
Tajo Shell(Tsql)を起動します
Tajoシェルクライアントを起動するには、次のコマンドを使用します-
$ bin/tsql
次の出力が表示されます-
welcome to
_____ ___ _____ ___
/_ _/_ |/_ _/ /
////_| |_/////
/_//_//_/___/\__/ 0.11.3
Try \? for help.
Tajo Shellを終了します
Tsqlを終了するには、次のコマンドを実行します-
default> \q
bye!
ここで、デフォルトはTajoのカタログを指します。
Web UI
次のURLを入力して、Tajo Web UIを起動します- http://localhost:26080/
ExecuteQueryオプションに似た次の画面が表示されます。
タホを止める
Tajoサーバーを停止するには、次のコマンドを使用します-
$ bin/stop-tajo.sh
あなたは次の応答を取得します-
localhost: stopping worker
stopping master
Apache Tajo-構成設定
Tajoの構成は、Hadoopの構成システムに基づいています。 この章では、Tajoの構成設定について詳しく説明します。
基本設定
Tajoは次の2つの構成ファイルを使用します-
- catalog-site.xml-カタログサーバーの構成。 *tajo-site.xml-他のTajoモジュールの構成。
分散モード構成
分散モードのセットアップは、Hadoop Distributed File System(HDFS)で実行されます。 Tajo分散モードのセットアップを構成する手順に従います。
tajo-site.xml
このファイルは@/path/to/tajo/conf *ディレクトリで利用可能で、他のTajoモジュールの構成として機能します。 分散モードでTajoにアクセスするには、“ tajo-site.xml” *に以下の変更を適用します。
<property>
<name>tajo.rootdir</name>
<value>hdfs://hostname:port/tajo</value>
</property>
<property>
<name>tajo.master.umbilical-rpc.address</name>
<value>hostname:26001</value>
</property>
<property>
<name>tajo.master.client-rpc.address</name>
<value>hostname:26002</value>
</property>
<property>
<name>tajo.catalog.client-rpc.address</name>
<value>hostname:26005</value>
</property>
マスターノードの構成
Tajoは、プライマリストレージタイプとしてHDFSを使用します。 設定は次のとおりであり、*“ tajo-site.xml” *に追加する必要があります。
<property>
<name>tajo.rootdir</name>
<value>hdfs://namenode_hostname:port/path</value>
</property>
カタログ構成
カタログサービスをカスタマイズする場合は、 $ path/to/Tajo/conf/catalogsite.xml.template を $ path/to/Tajo/conf/catalog-site.xml にコピーし、次の構成のいずれかを追加します。必要に応じて。
たとえば、*「Hive catalog store」*を使用してTajoにアクセスする場合、構成は次のようになります-
<property>
<name>tajo.catalog.store.class</name>
<value>org.apache.tajo.catalog.store.HCatalogStore</value>
</property>
*MySQL* カタログを保存する必要がある場合は、次の変更を適用します-
<property>
<name>tajo.catalog.store.class</name>
<value>org.apache.tajo.catalog.store.MySQLStore</value>
</property>
<property>
<name>tajo.catalog.jdbc.connection.id</name>
<value><mysql user name></value>
</property>
<property>
<name>tajo.catalog.jdbc.connection.password</name>
<value><mysql user password></value>
</property>
<property>
<name>tajo.catalog.jdbc.uri</name>
<value>jdbc:mysql://<mysql host name>:<mysql port>/<database name for tajo>
?createDatabaseIfNotExist = true</value>
</property>
同様に、他のTajoがサポートするカタログを構成ファイルに登録できます。
ワーカー構成
デフォルトでは、TajoWorkerはローカルファイルシステムに一時データを保存します。 次のように「tajo-site.xml」ファイルで定義されています-
<property>
<name>tajo.worker.tmpdir.locations</name>
<value>/disk1/tmpdir,/disk2/tmpdir,/disk3/tmpdir</value>
</property>
各ワーカーリソースの実行タスクの容量を増やすには、次の構成を選択します-
<property>
<name>tajo.worker.resource.cpu-cores</name>
<value>12</value>
</property>
<property>
<name>tajo.task.resource.min.memory-mb</name>
<value>2000</value>
</property>
<property>
<name>tajo.worker.resource.disks</name>
<value>4</value>
</property>
Tajoワーカーを専用モードで実行するには、次の構成を選択します-
<property>
<name>tajo.worker.resource.dedicated</name>
<value>true</value>
</property>
Apache Tajo-シェルコマンド
この章では、Tajo Shellコマンドを詳細に理解します。
Tajoシェルコマンドを実行するには、次のコマンドを使用してTajoサーバーとTajoシェルを起動する必要があります-
サーバーを起動
$ bin/start-tajo.sh
シェルを開始
$ bin/tsql
これで、上記のコマンドを実行する準備が整いました。
メタコマンド
メタコマンド*について説明しましょう。 Tsqlメタコマンドは、バックスラッシュ( ‘\’)*で始まります。
ヘルプコマンド
- 「\?」*コマンドを使用してヘルプオプションを表示します。
問い合わせ
default> \?
結果
上記の* \?*コマンドは、Tajoのすべての基本的な使用オプションをリストします。 次の出力が表示されます-
リストデータベース
Tajoのすべてのデータベースをリストするには、次のコマンドを使用します-
問い合わせ
default> \l
結果
次の出力が表示されます-
information_schema
default
現在、データベースは作成されていないため、2つの組み込みTajoデータベースが表示されます。
現在のデータベース
*\ c* オプションは、現在のデータベース名を表示するために使用されます。
問い合わせ
default> \c
結果
これで、ユーザー「username」としてデータベース「default」に接続されました。
組み込み関数をリストする
すべての組み込み関数をリストするには、次のようにクエリを入力します-
問い合わせ
default> \df
結果
次の出力が表示されます-
関数の説明
- \ df関数名*-このクエリは、指定された関数の完全な説明を返します。
問い合わせ
default> \df sqrt
結果
次の出力が表示されます-
ターミナルを終了
端末を終了するには、次のクエリを入力します-
問い合わせ
default> \q
結果
次の出力が表示されます-
bye!
管理コマンド
Tajoシェルは、すべての管理機能をリストする \ admin オプションを提供します。
問い合わせ
default> \admin
結果
次の出力が表示されます-
クラスター情報
Tajoでクラスター情報を表示するには、次のクエリを使用します
問い合わせ
default> \admin -cluster
結果
次の出力が表示されます-
マスターを表示
次のクエリは、現在のマスター情報を表示します。
問い合わせ
default> \admin -showmasters
結果
localhost
同様に、他の管理コマンドを試すことができます。
セッション変数
Tajoクライアントは、一意のセッションIDを介してマスターに接続します。 セッションは、クライアントが切断されるか期限切れになるまで有効です。
次のコマンドは、すべてのセッション変数をリストするために使用されます。
問い合わせ
default> \set
結果
'SESSION_LAST_ACCESS_TIME' = '1470206387146'
'CURRENT_DATABASE' = 'default'
‘USERNAME’ = 'user'
'SESSION_ID' = 'c60c9b20-dfba-404a-822f-182bc95d6c7c'
'TIMEZONE' = 'Asia/Kolkata'
'FETCH_ROWNUM' = '200'
‘COMPRESSED_RESULT_TRANSFER' = 'false'
*\ set key val* は、 *key* という名前のセッション変数に値 *val* を設定します。 例えば、
問い合わせ
default> \set ‘current_database’='default'
結果
usage: \set [[NAME] VALUE]
ここで、 \ set コマンドでキーと値を割り当てることができます。 変更を元に戻す必要がある場合は、 \ unset コマンドを使用します。
Apache Tajo-データ型
Tajoシェルでクエリを実行するには、ターミナルを開いてTajoのインストールディレクトリに移動し、次のコマンドを入力します-
$ bin/tsql
これで、次のプログラムに示すように応答が表示されます-
default>
これで、クエリを実行できます。 それ以外の場合は、Webコンソールアプリケーションから次のURLへのクエリを実行できます- http://localhost:26080/
プリミティブデータ型
Apache Tajoは、プリミティブデータ型の次のリストをサポートしています-
S.No. | Data type & Description |
---|---|
1 |
integer 4バイトストレージで整数値を格納するために使用されます。 |
2 |
tinyint 小さな整数値は1バイトです |
3 |
smallint 小さいサイズの整数2バイト値を格納するために使用されます。 |
4 |
bigint 大きな範囲の整数値には8バイトのストレージがあります。 |
5 |
boolean true/falseを返します。 |
6 |
real 実際の値を格納するために使用されます。 サイズは4バイトです。 |
7 |
float 4または8バイトの記憶領域を持つ浮動小数点の精度値。 |
8 |
double 8バイトで保存される倍精度の値。 |
9 |
char[(n)] 文字値。 |
10 |
varchar[(n)] 可変長の非Unicodeデータ。 |
11 |
number 10進値。 |
12 |
binary バイナリ値。 |
13 |
date カレンダーの日付(年、月、日)。 例-DATE '2016-08-22' |
14 |
time 時間帯なしの時刻(時間、分、秒、ミリ秒)。 このタイプの値は、セッションタイムゾーンで解析およびレンダリングされます。 |
15 |
timezone タイムゾーン付きの時刻(時間、分、秒、ミリ秒)。 このタイプの値は、値のタイムゾーンを使用してレンダリングされます。 例-TIME '01:02:03.456 Asia/kolkata ' |
16 |
timestamp 時間帯のない日付と時刻を含むインスタントインタイム。 例-TIMESTAMP '2016-08-22 03:04:05.321' |
17 |
text 可変長のUnicodeテキスト。 |
Apache Tajo-オペレーター
Tajoでは、次の演算子を使用して目的の操作を実行します。
S.No. | Operator & Description |
---|---|
1 |
Prestoは、&plus;、-、&ast;、/、%などの算術演算子をサポートしています。 |
2 |
<、>、⇐、> =、=、<> |
3 |
AND、OR、NOT |
4 |
「 |
」演算子は、文字列の連結を実行します。 | |
5 |
範囲演算子は、特定の範囲の値をテストするために使用されます。 Tajoは、BETWEEN、IS NULL、IS NOT NULL演算子をサポートしています。 |
Apache Tajo-SQL関数
これで、Tajoで簡単な基本クエリを実行することに気づきました。 次のいくつかの章では、次のSQL関数について説明します-
- リンク:/apache_tajo/apache_tajo_math_functions [数学関数]
- リンク:/apache_tajo/apache_tajo_string_functions [文字列関数]
- リンク:/apache_tajo/apache_tajo_datetime_functions [DateTime関数]
- リンク:/apache_tajo/apache_tajo_json_functions [JSON関数]
Apache Tajo-数学関数
数学関数は数式を操作します。 次の表は、関数のリストを詳細に説明しています。
S.No. | Function & Description |
---|---|
1 |
xの絶対値を返します。 |
2 |
xの立方根を返します。 |
3 |
x値を最も近い整数に切り上げて返します。 |
4 |
xを最も近い整数に切り捨てて返します。 |
5 |
pi値を返します。 結果はdouble値として返されます。 |
6 |
角度xをラジアン単位で変換します。 |
7 |
xの次数値を返します。 |
8 |
値「p」のべき乗をx値に戻します。 |
9 |
指定された2つのx、y整数値の除算結果を返します。 |
10 |
オイラーの数値 e を数値の累乗で返します。 |
11 |
xの平方根を返します。 |
12 |
xの符号関数を返します、つまり-
|
13 |
nをmで除算したモジュラス(剰余)を返します。 |
14 |
xの丸められた値を返します。 |
15 |
コサイン値(x)を返します。 |
16 |
逆正弦値(x)を返します。 |
17 |
逆コサイン値(x)を返します。 |
18 |
逆正接値(x)を返します。 |
19 |
逆正接値(y/x)を返します。 |
データ型関数
次の表に、Apache Tajoで使用可能なデータ型関数を示します。
S.No. | Function & Description |
---|---|
1 |
整数のバイナリ表現を返します。 |
2 |
整数を文字列に変換します。 |
3 |
x値を16進数に変換します。 |
Apache Tajo-文字列関数
次の表に、Tajoの文字列関数を示します。
S.No. | Function & Description |
---|---|
1 |
指定された文字列を連結します。 |
2 |
指定された文字列の長さを返します。 |
3 |
文字列の小文字形式を返します。 |
4 |
指定された文字列の大文字形式を返します。 |
5 |
テキストの最初の文字のASCIIコードを返します。 |
6 |
文字列のビット数を返します。 |
7 |
文字列の文字数を返します。 |
8 |
文字列のバイト数を返します。 |
9 |
digest(input text, method text) 文字列の Digest ハッシュを計算します。 ここで、2番目のargメソッドはハッシュメソッドを指します。 |
10 |
各単語の最初の文字を大文字に変換します。 |
11 |
文字列の MD5 ハッシュを計算します。 |
12 |
文字列の最初のn文字を返します。 |
13 |
文字列の最後のn文字を返します。 |
14 |
locate(source text, target text, start_index) 指定された部分文字列の場所を返します。 |
15 |
strposb(source text, target text) 指定された部分文字列のバイナリの場所を返します。 |
16 |
substr(source text, start index, length) 指定された長さの部分文字列を返します。 |
17 |
trim(string text[, characters text)] 文字列の開始/終了/両端から文字(デフォルトではスペース)を削除します。 |
18 |
split_part(string text, delimiter text, field int) 文字列を区切り文字で分割し、指定されたフィールド(1からカウント)を返します。 |
19 |
regexp_replace(string text, pattern text, replacement text) 特定の正規表現パターンに一致する部分文字列を置き換えます。 |
20 |
文字列に対して実行された逆の操作。 |
Apache Tajo-日時関数
Apache Tajoは、次のDateTime関数をサポートしています。
S.No. | Function & Description |
---|---|
1 |
add_days(date date or timestamp, int day 指定された日の値によって追加された日付を返します。 |
2 |
add_months(date date or timestamp, int month) 指定された月の値で追加された日付を返します。 |
3 |
今日の日付を返します。 |
4 |
今日の時間を返します。 |
5 |
extract(century from date/timestamp) 指定されたパラメーターから世紀を抽出します。 |
6 |
extract(day from date/timestamp) 指定されたパラメーターから日を抽出します。 |
7 |
extract(decade from date/timestamp) 指定されたパラメーターから10年を抽出します。 |
8 |
extract(day dow date/timestamp) 指定されたパラメーターから曜日を抽出します。 |
9 |
extract(doy from date/timestamp) 指定されたパラメーターから日付を抽出します。 |
10 |
select extract(hour from timestamp) 指定されたパラメーターから時間を抽出します。 |
11 |
select extract(isodow from timestamp) 指定されたパラメーターから曜日を抽出します。 これは日曜日を除いてダウと同じです。 これは、ISO 8601の曜日番号に一致します。 |
12 |
select extract(isoyear from date) 指定された日付からISO年を抽出します。 ISO年はグレゴリオ年と異なる場合があります。 |
13 |
extract(microseconds from time) 指定されたパラメーターからマイクロ秒を抽出します。 秒のフィールド(小数部分を含む)に1 000 000を掛けた値。 |
14 |
extract(millennium from timestamp ) 指定されたパラメーターから千年を抽出します。千年は1000年に相当します。 したがって、第3千年紀は2001年1月1日に始まりました。 |
15 |
extract(milliseconds from time) 指定されたパラメーターからミリ秒を抽出します。 |
16 |
extract(minute from timestamp ) 指定されたパラメーターから分を抽出します。 |
17 |
extract(quarter from timestamp) 指定されたパラメーターから四半期(1-4)を抽出します。 |
18 |
date_part(field text, source date or timestamp or time) テキストから日付フィールドを抽出します。 |
19 |
現在のタイムスタンプを返します。 |
20 |
to_char(timestamp, format text) タイムスタンプをテキストに変換します。 |
21 |
to_date(src text, format text) テキストを日付に変換します。 |
22 |
to_timestamp(src text, format text) テキストをタイムスタンプに変換します。 |
Apache Tajo-JSON関数
JSON関数は次の表にリストされています-
S.No. | Function & Description |
---|---|
1 |
json_extract_path_text(js on text, json_path text) 指定されたJSONパスに基づいてJSON文字列からJSON文字列を抽出します。 |
2 |
json_array_get(json_array text, index int4) 指定されたインデックスの要素をJSON配列に返します。 |
3 |
json_array_contains(json_ array text, value any) 指定された値がJSON配列に存在するかどうかを判別します。 |
4 |
json_array_length(json_ar ray text) JSON配列の長さを返します。 |
Apache Tajo-データベース作成
このセクションでは、Tajo DDLコマンドについて説明します。 Tajoには、 default という名前の組み込みデータベースがあります。
データベースステートメントの作成
*Create Database* は、Tajoでデータベースを作成するために使用されるステートメントです。 このステートメントの構文は次のとおりです-
CREATE DATABASE [IF NOT EXISTS] <database_name>
問い合わせ
default> default> create database if not exists test;
結果
上記のクエリは、次の結果を生成します。
OK
データベースはTajoの名前空間です。 データベースには、一意の名前を持つ複数のテーブルを含めることができます。
現在のデータベースを表示
現在のデータベース名を確認するには、次のコマンドを発行します-
問い合わせ
default> \c
結果
上記のクエリは、次の結果を生成します。
You are now connected to database "default" as user “user1".
default>
データベースに接続する
これで、「test」という名前のデータベースが作成されました。 「テスト」データベースに接続するには、次の構文を使用します。
\c <database name>
問い合わせ
default> \c test
結果
上記のクエリは、次の結果を生成します。
You are now connected to database "test" as user “user1”.
test>
これで、デフォルトデータベースからテストデータベースへのプロンプトの変更を確認できます。
データベースを削除
データベースを削除するには、次の構文を使用します-
DROP DATABASE <database-name>
問い合わせ
test> \c default
You are now connected to database "default" as user “user1".
default> drop database test;
結果
上記のクエリは、次の結果を生成します。
OK
Apache Tajo-テーブル管理
テーブルは、1つのデータソースの論理ビューです。 論理スキーマ、パーティション、URL、およびさまざまなプロパティで構成されます。 Tajoテーブルは、HDFSのディレクトリ、単一のファイル、1つのHBaseテーブル、またはRDBMSテーブルにすることができます。
Tajoは、次の2種類のテーブルをサポートしています-
- 外部テーブル
- 内部テーブル
外部テーブル
外部テーブルには、テーブルの作成時に場所プロパティが必要です。 たとえば、データが既にText/JSONファイルまたはHBaseテーブルとして存在する場合、Tajo外部テーブルとして登録できます。
次のクエリは、外部テーブル作成の例です。
create external table sample(col1 int,col2 text,col3 int) location ‘hdfs://path/to/table';
ここに、
- 外部キーワード-これは外部テーブルを作成するために使用されます。 これは、指定された場所にテーブルを作成するのに役立ちます。
- サンプルはテーブル名を参照します。
- 場所-HDFS、Amazon S3、HBase、またはローカルファイルシステムのディレクトリです。 ディレクトリの場所のプロパティを割り当てるには、以下のURIの例を使用してください-
- HDFS -hdfs://localhost:port/path/to/table
- Amazon S3 -s3://bucket-name/table
- ローカルファイルシステム-file:///path/to/table
- Openstack Swift -swift://bucket-name/table
テーブルのプロパティ
外部テーブルには、次のプロパティがあります-
- TimeZone -ユーザーは、テーブルの読み取りまたは書き込みのタイムゾーンを指定できます。
- 圧縮形式-データサイズをコンパクトにするために使用されます。 たとえば、text/jsonファイルは compression.codec プロパティを使用します。
内部テーブル
内部テーブルは、*管理テーブル*とも呼ばれます。 テーブルスペースと呼ばれる定義済みの物理的な場所に作成されます。
構文
create table table1(col1 int,col2 text);
デフォルトでは、Tajoは「conf/tajo-site.xml」にある「tajo.warehouse.directory」を使用します。 テーブルに新しい場所を割り当てるには、テーブルスペース構成を使用できます。
テーブルスペース
表領域は、ストレージシステム内の場所を定義するために使用されます。 内部テーブルのみでサポートされています。 名前で表領域にアクセスできます。 各テーブルスペースは異なるストレージタイプを使用できます。 テーブルスペースを指定しない場合、Tajoはルートディレクトリのデフォルトのテーブルスペースを使用します。
表領域の構成
Tajoには*「conf/tajo-site.xml.template」があります。 ファイルをコピーし、名前を“ storagesite.json” *に変更します。 このファイルは、表領域の構成として機能します。 Tajoデータ形式は次の構成を使用します-
HDFS設定
$ vi conf/storage-site.json {
"spaces": {
"${tablespace_name}": {
"uri": “hdfs://localhost:9000/path/to/Tajo"
}
}
}
HBaseの構成
$ vi conf/storage-site.json {
"spaces": {
"${tablespace_name}": {
"uri": “hbase:zk://quorum1:port,quorum2:port/"
}
}
}
テキストファイルの構成
$ vi conf/storage-site.json {
"spaces": {
"${tablespace_name}": {
“uri”: “hdfs://localhost:9000/path/to/Tajo”
}
}
}
テーブルスペースの作成
Tajoの内部テーブルレコードには、別のテーブルからのみアクセスできます。 表領域を使用して構成できます。
構文
CREATE TABLE [IF NOT EXISTS] <table_name> [(column_list)] [TABLESPACE tablespace_name]
[using <storage_type> [with (<key> = <value>, ...)]] [AS <select_statement>]
ここに、
- IF NOT EXISTS -同じテーブルがまだ作成されていない場合のエラーを回避します。
- TABLESPACE -この句は、テーブルスペース名を割り当てるために使用されます。
- ストレージタイプ-Tajoデータは、text、JSON、HBase、Parquet、Sequencefile、ORCなどの形式をサポートしています。
- * AS selectステートメント*-別のテーブルからレコードを選択します。
表領域の構成
Hadoopサービスを開始し、ファイル「“ conf/storage-site.json” *」を開き、次の変更を追加します-
$ vi conf/storage-site.json {
"spaces": {
“space1”: {
"uri": “hdfs://localhost:9000/path/to/Tajo"
}
}
}
ここで、TajoはHDFSロケーションからのデータを参照し、 space1 はテーブルスペース名です。 Hadoopサービスを開始しないと、テーブルスペースを登録できません。
問い合わせ
default> create table table1(num1 int,num2 text,num3 float) tablespace space1;
上記のクエリは、「table1」という名前のテーブルを作成し、「space1」はテーブルスペース名を参照します。
データ形式
Tajoはデータ形式をサポートしています。 それぞれの形式について詳しく見ていきましょう。
Text
文字区切り値のプレーンテキストファイルは、行と列で構成される表形式のデータセットを表します。 各行はプレーンテキストの行です。
テーブルを作成する
default> create external table customer(id int,name text,address text,age int)
using text with('text.delimiter'=',') location ‘file:/Users/workspace/Tajo/customers.csv’;
ここで、*“ customers.csv” *ファイルは、Tajoインストールディレクトリにあるコンマ区切り値ファイルを指します。
テキスト形式を使用して内部テーブルを作成するには、次のクエリを使用します-
default> create table customer(id int,name text,address text,age int) using text;
上記のクエリでは、テーブルスペースが割り当てられていないため、Tajoのデフォルトのテーブルスペースが使用されます。
プロパティ
テキストファイル形式には、次のプロパティがあります-
- text.delimiter -これは区切り文字です。 デフォルトは「|」です。
- compression.codec -これは圧縮形式です。 デフォルトでは無効になっています。 指定したアルゴリズムを使用して設定を変更できます。
- timezone -読み取りまたは書き込みに使用されるテーブル。
- text.error-tolerance.max-num -許容レベルの最大数。
- text.skip.headerlines -スキップされるヘッダー行の数。
- text.serde -これはシリアル化プロパティです。
JSON
Apache Tajoは、データのクエリ用にJSON形式をサポートしています。 TajoはJSONオブジェクトをSQLレコードとして扱います。 1つのオブジェクトは、Tajoテーブルの1行に相当します。 次のように「array.json」を考えてみましょう-
$ hdfs dfs -cat/json/array.json {
"num1" : 10,
"num2" : "simple json array",
"num3" : 50.5
}
このファイルを作成したら、Tajoシェルに切り替えて次のクエリを入力し、JSON形式を使用してテーブルを作成します。
問い合わせ
default> create external table sample (num1 int,num2 text,num3 float)
using json location ‘json/array.json’;
ファイルデータはテーブルスキーマと一致する必要があることを常に覚えておいてください。 それ以外の場合は、列名を省略して、列リストを必要としない*を使用できます。
内部テーブルを作成するには、次のクエリを使用します-
default> create table sample (num1 int,num2 text,num3 float) using json;
寄木細工
寄木細工は円柱状のストレージ形式です。 TajoはParquet形式を使用して、簡単、高速、効率的なアクセスを実現しています。
テーブル作成
次のクエリは、テーブル作成の例です-
CREATE TABLE parquet (num1 int,num2 text,num3 float) USING PARQUET;
寄木細工のファイル形式には、次のプロパティがあります-
- parquet.block.size -メモリにバッファされる行グループのサイズ。
- parquet.page.size -ページサイズは圧縮用です。
- parquet.compression -ページの圧縮に使用される圧縮アルゴリズム。
- parquet.enable.dictionary -ブール値は、辞書のエンコードを有効/無効にすることです。
RCFile
RCFileはRecord Columnar Fileです。 バイナリキー/値のペアで構成されます。
テーブル作成
次のクエリは、テーブル作成の例です-
CREATE TABLE Record(num1 int,num2 text,num3 float) USING RCFILE;
RCFileには次のプロパティがあります-
- rcfile.serde -カスタムデシリアライザークラス。
- compression.codec -圧縮アルゴリズム。
- rcfile.null -NULL文字。
SequenceFile
SequenceFileは、キーと値のペアで構成されるHadoopの基本的なファイル形式です。
テーブル作成
次のクエリは、テーブル作成の例です-
CREATE TABLE seq(num1 int,num2 text,num3 float) USING sequencefile;
このシーケンスファイルには、Hiveとの互換性があります。 これは、Hiveで次のように記述できます。
CREATE TABLE table1 (id int, name string, score float, type string)
STORED AS sequencefile;
ORC
ORC(最適化された行の列)は、Hiveの列ストレージ形式です。
テーブル作成
次のクエリは、テーブル作成の例です-
CREATE TABLE optimized(num1 int,num2 text,num3 float) USING ORC;
ORC形式には次のプロパティがあります-
- orc.max.merge.distance -ORCファイルが読み込まれ、距離が短くなるとマージされます。
- orc.stripe.size -これは各ストライプのサイズです。
- orc.buffer.size -デフォルトは256KBです。
- orc.rowindex.stride -これは、行数のORCインデックスストライドです。
Apache Tajo-SQLステートメント
前の章で、Tajoでテーブルを作成する方法を理解しました。 この章では、TajoのSQLステートメントについて説明します。
テーブルステートメントの作成
テーブルを作成するために移動する前に、次のようにTajoインストールディレクトリパスにテキストファイル「students.csv」を作成します-
*students.csv*
Id | Name | Address | Age | Marks |
---|---|---|---|---|
1 | Adam | 23 New Street | 21 | 90 |
2 | Amit | 12 Old Street | 13 | 95 |
3 | Bob | 10 Cross Street | 12 | 80 |
4 | David | 15 Express Avenue | 12 | 85 |
5 | Esha | 20 Garden Street | 13 | 50 |
6 | Ganga | 25 North Street | 12 | 55 |
7 | Jack | 2 Park Street | 12 | 60 |
8 | Leena | 24 South Street | 12 | 70 |
9 | Mary | 5 West Street | 12 | 75 |
10 | Peter | 16 Park Avenue | 12 | 95 |
ファイルが作成されたら、ターミナルに移動し、Tajoサーバーとシェルを1つずつ起動します。
データベースを作成する
次のコマンドを使用して新しいデータベースを作成します-
問い合わせ
default> create database sampledb;
OK
作成されたデータベース「sampledb」に接続します。
default> \c sampledb
You are now connected to database "sampledb" as user “user1”.
次に、次のように「sampledb」にテーブルを作成します-
問い合わせ
sampledb> create external table mytable(id int,name text,address text,age int,mark int)
using text with('text.delimiter' = ',') location ‘file:/Users/workspace/Tajo/students.csv’;
結果
上記のクエリは、次の結果を生成します。
OK
ここで、外部テーブルが作成されます。 ここで、ファイルの場所を入力するだけです。 hdfsからテーブルを割り当てる必要がある場合は、fileではなくhdfsを使用します。
次に、“ students.csv” *ファイルにはコンマ区切り値が含まれています。 *text.delimiter フィールドには「、」が割り当てられます。
これで、「sampledb」に「mytable」が正常に作成されました。
テーブルを表示
Tajoのテーブルを表示するには、次のクエリを使用します。
問い合わせ
sampledb> \d
mytable
sampledb> \d mytable
結果
上記のクエリは、次の結果を生成します。
table name: sampledb.mytable
table uri: file:/Users/workspace/Tajo/students.csv
store type: TEXT
number of rows: unknown
volume: 261 B
Options:
'timezone' = 'Asia/Kolkata'
'text.null' = '\\N'
'text.delimiter' = ','
schema:
id INT4
name TEXT
address TEXT
age INT4
mark INT4
リスト表
テーブル内のすべてのレコードを取得するには、次のクエリを入力します-
問い合わせ
sampledb> select *from mytable;
結果
上記のクエリは、次の結果を生成します。
テーブルステートメントの挿入
Tajoは、次の構文を使用してテーブルにレコードを挿入します。
構文
create table table1 (col1 int8, col2 text, col3 text);
--schema should be same for target table schema
Insert overwrite into table1 select* from table2;
(or)
Insert overwrite into LOCATION '/dir/subdir' select * from table;
Tajoのinsertステートメントは、SQLの INSERT INTO SELECT ステートメントに似ています。
問い合わせ
既存のテーブルのテーブルデータを上書きするテーブルを作成しましょう。
sampledb> create table test(sno int,name text,addr text,age int,mark int);
OK
sampledb> \d
結果
上記のクエリは、次の結果を生成します。
mytable
test
レコードを挿入
「テスト」テーブルにレコードを挿入するには、次のクエリを入力します。
問い合わせ
sampledb> insert overwrite into test select *from mytable;
結果
上記のクエリは、次の結果を生成します。
Progress: 100%, response time: 0.518 sec
ここでは、「mytable」レコードが「test」テーブルを上書きします。 「テスト」テーブルを作成したくない場合は、クエリを挿入するための代替オプションで説明されているように、すぐに物理パスの場所を割り当てます。
レコードを取得する
「テスト」テーブル内のすべてのレコードをリストするには、次のクエリを使用します-
問い合わせ
sampledb> select* from test;
結果
上記のクエリは、次の結果を生成します。
このステートメントは、既存のテーブルの列を追加、削除、または変更するために使用されます。
テーブルの名前を変更するには、次の構文を使用します-
Alter table table1 RENAME TO table2;
問い合わせ
sampledb> alter table test rename to students;
結果
上記のクエリは、次の結果を生成します。
OK
変更されたテーブル名を確認するには、次のクエリを使用します。
sampledb> \d
mytable
students
テーブル「test」が「students」テーブルに変更されました。
列を追加
「学生」テーブルに新しい列を挿入するには、次の構文を入力します-
Alter table <table_name> ADD COLUMN <column_name> <data_type>
問い合わせ
sampledb> alter table students add column grade text;
結果
上記のクエリは、次の結果を生成します。
OK
プロパティを設定
このプロパティは、テーブルのプロパティを変更するために使用されます。
問い合わせ
sampledb> ALTER TABLE students SET PROPERTY 'compression.type' = 'RECORD',
'compression.codec' = 'org.apache.hadoop.io.compress.Snappy Codec' ;
OK
ここでは、圧縮タイプとコーデックプロパティが割り当てられます。
テキスト区切りプロパティを変更するには、次を使用します-
問い合わせ
ALTER TABLE students SET PROPERTY ‘text.delimiter'=',';
OK
結果
上記のクエリは、次の結果を生成します。
sampledb> \d students
table name: sampledb.students
table uri: file:/tmp/tajo-user1/warehouse/sampledb/students
store type: TEXT
number of rows: 10
volume: 228 B
Options:
'compression.type' = 'RECORD'
'timezone' = 'Asia/Kolkata'
'text.null' = '\\N'
'compression.codec' = 'org.apache.hadoop.io.compress.SnappyCodec'
'text.delimiter' = ','
schema:
id INT4
name TEXT
addr TEXT
age INT4
mark INT4
grade TEXT
上記の結果は、「SET」プロパティを使用してテーブルのプロパティが変更されることを示しています。
選択ステートメント
SELECTステートメントは、データベースからデータを選択するために使用されます。
Selectステートメントの構文は次のとおりです-
SELECT [distinct [all]] *| <expression> [[AS] <alias>] [, ...]
[FROM <table reference> [[AS] <table alias name>] [, ...]]
[WHERE <condition>]
[GROUP BY <expression> [, ...]]
[HAVING <condition>]
[ORDER BY <expression> [ASC|DESC] [NULLS (FIRST|LAST)] [, …]]
Where句
Where句は、テーブルからレコードをフィルタリングするために使用されます。
問い合わせ
sampledb> select* from mytable where id > 5;
結果
上記のクエリは、次の結果を生成します。
クエリは、idが5より大きい生徒のレコードを返します。
問い合わせ
sampledb> select * from mytable where name = ‘Peter’;
結果
上記のクエリは、次の結果を生成します。
Progress: 100%, response time: 0.117 sec
id, name, address, age
-------------------------------
10, Peter, 16 park avenue , 12
結果はPeterのレコードのみをフィルタリングします。
明確な条項
テーブルの列に重複した値が含まれる場合があります。 DISTINCTキーワードを使用して、異なる(異なる)値のみを返すことができます。
構文
SELECT DISTINCT column1,column2 FROM table_name;
問い合わせ
sampledb> select distinct age from mytable;
結果
上記のクエリは、次の結果を生成します。
Progress: 100%, response time: 0.216 sec
age
-------------------------------
13
12
このクエリは、 mytable から学生の明確な年齢を返します。
句ごとのグループ化
GROUP BY句は、SELECTステートメントと連携して使用され、同一のデータをグループに配置します。
構文
SELECT column1, column2 FROM table_name WHERE [ conditions ] GROUP BY column1, column2;
問い合わせ
select age,sum(mark) as sumofmarks from mytable group by age;
結果
上記のクエリは、次の結果を生成します。
age, sumofmarks
-------------------------------
13, 145
12, 610
ここで、「mytable」列には、12と13の2種類の年齢があります。 これで、クエリはレコードを年齢別にグループ化し、対応する学生の年齢のマークの合計を生成します。
句を持っている
HAVING句を使用すると、最終結果に表示されるグループ結果をフィルタリングする条件を指定できます。 WHERE句は選択した列に条件を配置しますが、HAVING句はGROUP BY句によって作成されたグループに条件を配置します。
構文
SELECT column1, column2 FROM table1 GROUP BY column HAVING [ conditions ]
問い合わせ
sampledb> select age from mytable group by age having sum(mark) > 200;
結果
上記のクエリは、次の結果を生成します。
age
-------------------------------
12
クエリは、レコードを年齢でグループ化し、条件結果sum(mark)> 200のときに年齢を返します。
条項による注文
ORDER BY句は、1つ以上の列に基づいてデータを昇順または降順に並べ替えるために使用されます。 Tajoデータベースは、デフォルトでクエリ結果を昇順でソートします。
構文
SELECT column-list FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
問い合わせ
sampledb> select * from mytable where mark > 60 order by name desc;
結果
上記のクエリは、次の結果を生成します。
クエリは、マークが60より大きい生徒の名前を降順で返します。
インデックスステートメントの作成
CREATE INDEXステートメントは、テーブルにインデックスを作成するために使用されます。 インデックスは、データの高速取得に使用されます。 現在のバージョンでは、HDFSに保存されているプレーンテキスト形式のインデックスのみがサポートされています。
構文
CREATE INDEX [ name ] ON table_name ( { column_name | ( expression ) }
問い合わせ
create index student_index on mytable(id);
結果
上記のクエリは、次の結果を生成します。
id
———————————————
列に割り当てられたインデックスを表示するには、次のクエリを入力します。
default> \d mytable
table name: default.mytable
table uri: file:/Users/deiva/workspace/Tajo/students.csv
store type: TEXT
number of rows: unknown
volume: 307 B
Options:
'timezone' = 'Asia/Kolkata'
'text.null' = '\\N'
'text.delimiter' = ','
schema:
id INT4
name TEXT
address TEXT
age INT4
mark INT4
Indexes:
"student_index" TWO_LEVEL_BIN_TREE (id ASC NULLS LAST )
ここでは、TWOでTWO_LEVEL_BIN_TREEメソッドがデフォルトで使用されます。
テーブルステートメントの削除
Drop Tableステートメントは、データベースからテーブルを削除するために使用されます。
構文
drop table table name;
問い合わせ
sampledb> drop table mytable;
テーブルがテーブルから削除されたかどうかを確認するには、次のクエリを入力します。
sampledb> \d mytable;
結果
上記のクエリは、次の結果を生成します。
ERROR: relation 'mytable' does not exist
「\ d」コマンドを使用してクエリを確認し、使用可能なTajoテーブルをリストすることもできます。
集計およびウィンドウ関数
この章では、集計関数とウィンドウ関数について詳しく説明します。
集計関数
集計関数は、一連の入力値から単一の結果を生成します。 次の表は、集計関数のリストを詳細に説明しています。
S.No. | Function & Description |
---|---|
1 |
データソース内のすべてのレコードの列を平均します。 |
2 |
CORR(expression1, expression2) 数値ペアのセット間の相関係数を返します。 |
3 |
行数を返します。 |
4 |
選択した列の最大値を返します。 |
5 |
選択した列の最小値を返します。 |
6 |
指定された列の合計を返します。 |
7 |
指定された列の最後の値を返します。 |
ウィンドウ機能
ウィンドウ関数は一連の行で実行され、クエリから各行に単一の値を返します。 ウィンドウという用語には、関数の行のセットという意味があります。
クエリのWindow関数は、OVER()句を使用してウィンドウを定義します。
- OVER()*句には次の機能があります-
- 行のグループを形成するウィンドウパーティションを定義します。 (PARTITION BY句)
- パーティション内の行を並べ替えます。 (ORDER BY句)
次の表に、ウィンドウ関数の詳細を示します。
Function | Return type | Description |
---|---|---|
rank() | int | Returns rank of the current row with gaps. |
row_num() | int | Returns the current row within its partition, counting from 1. |
lead(value[, offset integer[, default any])] | Same as input type | Returns value evaluated at the row that is offset rows after the current row within the partition. If there is no such row, default value will be returned. |
lag(value[, offset integer[, default any])] | Same as input type | Returns value evaluated at the row that is offset rows before the current row within the partition. |
first_value(value) | Same as input type | Returns the first value of input rows. |
last_value(value) | Same as input type | Returns the last value of input rows. |
Apache Tajo-SQLクエリ
この章では、次の重要なクエリについて説明します。
- 述語
- 説明する
- Join
先に進み、クエリを実行しましょう。
述語
述語は、true/false値とUNKNOWNを評価するために使用される式です。 述語は、WHERE句およびHAVING句の検索条件、およびブール値が必要なその他の構造で使用されます。
IN述語
テストする式の値がサブクエリまたはリストの値と一致するかどうかを判断します。 サブクエリは、1つの列と1つ以上の行の結果セットを持つ通常のSELECTステートメントです。 この列またはリスト内のすべての式は、テストする式と同じデータ型である必要があります。
構文
IN::=
<expression to test> [NOT] IN (<subquery>)
| (<expression1>,...)
問い合わせ
select id,name,address from mytable where id in(2,3,4);
結果
上記のクエリは、次の結果を生成します。
id, name, address
-------------------------------
2, Amit, 12 old street
3, Bob, 10 cross street
4, David, 15 express avenue
クエリは、学生ID 2、3、4の mytable からレコードを返します。
問い合わせ
select id,name,address from mytable where id not in(2,3,4);
結果
上記のクエリは、次の結果を生成します。
id, name, address
-------------------------------
1, Adam, 23 new street
5, Esha, 20 garden street
6, Ganga, 25 north street
7, Jack, 2 park street
8, Leena, 24 south street
9, Mary, 5 west street
10, Peter, 16 park avenue
上記のクエリは、学生が2,3と4にない mytable からレコードを返します。
述語のように
LIKE述語は、文字列値を計算するための最初の式で指定された文字列(テストする値と呼ばれる)を、文字列値を計算するための2番目の式で定義されたパターンと比較します。
パターンには、次のようなワイルドカードの任意の組み合わせを含めることができます-
- 下線記号(_)。テストする値の単一文字の代わりに使用できます。
- パーセント記号(%)。テストする値内のゼロ文字以上の文字列を置き換えます。
構文
LIKE::=
<expression for calculating the string value>
[NOT] LIKE
<expression for calculating the string value>
[ESCAPE <symbol>]
- 問い合わせ *
select* from mytable where name like ‘A%';
結果
上記のクエリは、次の結果を生成します。
id, name, address, age, mark
-------------------------------
1, Adam, 23 new street, 12, 90
2, Amit, 12 old street, 13, 95
クエリは、名前が「A」で始まる生徒のmytableからレコードを返します。
- 問い合わせ *
select* from mytable where name like ‘_a%';
結果
上記のクエリは、次の結果を生成します。
id, name, address, age, mark
——————————————————————————————————————-
4, David, 15 express avenue, 12, 85
6, Ganga, 25 north street, 12, 55
7, Jack, 2 park street, 12, 60
9, Mary, 5 west street, 12, 75
クエリは、名前が2番目の文字が「a」で始まる生徒の mytable からレコードを返します。
検索条件でのNULL値の使用
ここで、検索条件でNULL値を使用する方法を理解しましょう。
構文
Predicate
IS [NOT] NULL
問い合わせ
select name from mytable where name is not null;
結果
上記のクエリは、次の結果を生成します。
name
-------------------------------
Adam
Amit
Bob
David
Esha
Ganga
Jack
Leena
Mary
Peter
(10 rows, 0.076 sec, 163 B selected)
ここでは、結果はtrueなので、テーブルからすべての名前を返します。
問い合わせ
ここで、NULL条件を使用してクエリを確認します。
default> select name from mytable where name is null;
結果
上記のクエリは、次の結果を生成します。
name
-------------------------------
(0 rows, 0.068 sec, 0 B selected)
説明する
*Explain* は、クエリ実行プランを取得するために使用されます。 文の論理的およびグローバルな計画実行を示します。
論理計画クエリ
explain select * from mytable;
explain
-------------------------------
=> target list: default.mytable.id (INT4), default.mytable.name (TEXT),
default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4)
=> out schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
=> in schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
結果
上記のクエリは、次の結果を生成します。
クエリ結果には、指定されたテーブルの論理プラン形式が表示されます。 論理計画は、次の3つの結果を返します-
- 対象リスト
- 出力スキーマ *スキーマ内
グローバルプランクエリ
explain global select* from mytable;
explain
-------------------------------
-------------------------------------------------------------------------------
Execution Block Graph (TERMINAL - eb_0000000000000_0000_000002)
-------------------------------------------------------------------------------
|-eb_0000000000000_0000_000002
|-eb_0000000000000_0000_000001
-------------------------------------------------------------------------------
Order of Execution
-------------------------------------------------------------------------------
1: eb_0000000000000_0000_000001
2: eb_0000000000000_0000_000002
-------------------------------------------------------------------------------
=======================================================
Block Id: eb_0000000000000_0000_000001 [ROOT]
=======================================================
SCAN(0) on default.mytable
=> target list: default.mytable.id (INT4), default.mytable.name (TEXT),
default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4)
=> out schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT),default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
=> in schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
=======================================================
Block Id: eb_0000000000000_0000_000002 [TERMINAL]
=======================================================
(24 rows, 0.065 sec, 0 B selected)
結果
上記のクエリは、次の結果を生成します。
ここで、グローバルプランには、実行ブロックID、実行順序、およびその情報が表示されます。
参加する
SQL結合は、2つ以上のテーブルの行を結合するために使用されます。 以下は、SQL結合のさまざまなタイプです-
- 内部結合
- \ {左|右| FULL}外部参加
- クロス結合
- 自己参加
- 自然結合
結合操作を実行するには、次の2つのテーブルを検討してください。
表1-顧客
Id | Name | Address | Age |
---|---|---|---|
1 | Customer 1 | 23 Old Street | 21 |
2 | Customer 2 | 12 New Street | 23 |
3 | Customer 3 | 10 Express Avenue | 22 |
4 | Customer 4 | 15 Express Avenue | 22 |
5 | Customer 5 | 20 Garden Street | 33 |
6 | Customer 6 | 21 North Street | 25 |
表2-customer_order
Id | Order Id | Emp Id |
---|---|---|
1 | 1 | 101 |
2 | 2 | 102 |
3 | 3 | 103 |
4 | 4 | 104 |
5 | 5 | 105 |
次に進み、上記の2つのテーブルでSQL結合操作を実行します。
内部結合
内部結合は、両方のテーブルの列が一致する場合、両方のテーブルからすべての行を選択します。
構文
SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
問い合わせ
default> select c.age,c1.empid from customers c inner join customer_order c1 on c.id = c1.id;
結果
上記のクエリは、次の結果を生成します。
age, empid
-------------------------------
21, 101
23, 102
22, 103
22, 104
33, 105
クエリは、両方のテーブルの5つの行に一致します。 したがって、最初のテーブルから一致した行の経過時間を返します。
左外部結合
左外部結合は、「右」テーブルに一致する行があるかどうかに関係なく、「左」テーブルのすべての行を保持します。
問い合わせ
select c.name,c1.empid from customers c left outer join customer_order c1 on c.id = c1.id;
結果
上記のクエリは、次の結果を生成します。
name, empid
-------------------------------
customer1, 101
customer2, 102
customer3, 103
customer4, 104
customer5, 105
customer6,
ここで、左外部結合は、customers(left)テーブルのname列の行と、customer_order(right)テーブルのempid列に一致する行を返します。
右外部結合
右外部結合は、「左」テーブルに一致する行があるかどうかに関係なく、「右」テーブルのすべての行を保持します。
問い合わせ
select c.name,c1.empid from customers c right outer join customer_order c1 on c.id = c1.id;
結果
上記のクエリは、次の結果を生成します。
name, empid
-------------------------------
customer1, 101
customer2, 102
customer3, 103
customer4, 104
customer5, 105
ここで、Right Outer Joinはcustomer_order(right)テーブルからempid行を返し、name列はcustomersテーブルから一致した行を返します。
フル外部結合
完全外部結合では、左テーブルと右テーブルの両方のすべての行が保持されます。
- 問い合わせ *
select* from customers c full outer join customer_order c1 on c.id = c1.id;
結果
上記のクエリは、次の結果を生成します。
クエリは、customersテーブルとcustomer_orderテーブルの両方から一致する行と一致しない行をすべて返します。
クロスジョイン
これは、2つ以上の結合されたテーブルからのレコードのセットのデカルト積を返します。
- 構文 *
SELECT* FROM table1 CROSS JOIN table2;
問い合わせ
select orderid,name,address from customers,customer_order;
結果
上記のクエリは、次の結果を生成します。
上記のクエリは、テーブルのデカルト積を返します。
自然結合
Natural Joinは、比較演算子を使用しません。 デカルト積のようには連結しません。 2つの関係の間に少なくとも1つの共通属性が存在する場合にのみ、Natural Joinを実行できます。
- 構文 *
SELECT* FROM table1 NATURAL JOIN table2;
- 問い合わせ *
select* from customers natural join customer_order;
結果
上記のクエリは、次の結果を生成します。
ここでは、2つのテーブル間に存在する共通の列IDが1つあります。 その共通列を使用して、 Natural Join は両方のテーブルを結合します。
自己参加
SQL SELF JOINは、テーブルが2つのテーブルであるかのようにテーブルをそれ自体に結合するために使用され、SQLステートメントで少なくとも1つのテーブルの名前を一時的に変更します。
構文
SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_filed = b.common_field
問い合わせ
default> select c.id,c1.name from customers c, customers c1 where c.id = c1.id;
結果
上記のクエリは、次の結果を生成します。
id, name
-------------------------------
1, customer1
2, customer2
3, customer3
4, customer4
5, customer5
6, customer6
クエリは、顧客テーブルをそれ自体に結合します。
Apache Tajo-ストレージプラグイン
Tajoはさまざまなストレージ形式をサポートしています。 ストレージプラグイン構成を登録するには、構成ファイル「storage-site.json」に変更を追加する必要があります。
storage-site.json
構造は次のように定義されています-
{
"storages": {
“storage plugin name“: {
"handler": "${class name}”, "default-format": “plugin name"
}
}
}
各ストレージインスタンスはURIで識別されます。
PostgreSQLストレージハンドラー
TajoはPostgreSQLストレージハンドラーをサポートしています。 これにより、ユーザークエリがPostgreSQLのデータベースオブジェクトにアクセスできます。 これはTajoのデフォルトのストレージハンドラーなので、簡単に構成できます。
構成
{
"spaces": {
"postgre": {
"uri": "jdbc:postgresql://hostname:port/database1"
"configs": {
"mapped_database": “sampledb”
"connection_properties": {
"user":“tajo", "password": "pwd"
}
}
}
}
}
ここで、“ database1” *は、Tajoのデータベース“ sampledb” にマップされる *postgreSQL データベースを指します。
Apache Tajo-HBaseとの統合
Apache TajoはHBase統合をサポートしています。 これにより、TajoのHBaseテーブルにアクセスできます。 HBaseは、Hadoopファイルシステム上に構築された分散列指向データベースです。 これは、Hadoopファイルシステム内のデータへのランダムなリアルタイム読み取り/書き込みアクセスを提供するHadoopエコシステムの一部です。 HBase統合を構成するには、次の手順が必要です。
環境変数を設定する
「conf/tajo-env.sh」ファイルに次の変更を追加します。
$ vi conf/tajo-env.sh
# HBase home directory. It is opitional but is required mandatorily to use HBase.
# export HBASE_HOME = path/to/HBase
HBaseパスを含めた後、TajoはHBaseライブラリファイルをクラスパスに設定します。
外部テーブルを作成する
次の構文を使用して外部テーブルを作成します-
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> [(<column_name> <data_type>, ... )]
USING hbase WITH ('table' = '<hbase_table_name>'
, 'columns' = ':key,<column_family_name>:<qualifier_name>, ...'
, 'hbase.zookeeper.quorum' = '<zookeeper_address>'
, 'hbase.zookeeper.property.clientPort' = '<zookeeper_client_port>')
[LOCATION 'hbase:zk://<hostname>:<port>/'] ;
HBaseテーブルにアクセスするには、テーブルスペースの場所を設定する必要があります。
ここに、
- Table -hbase originテーブル名を設定します。 外部テーブルを作成する場合、テーブルはHBaseに存在する必要があります。
- 列-キーはHBase行キーを指します。 列エントリの数は、Tajoテーブルの列の数と等しくする必要があります。
- hbase.zookeeper.quorum -ズーキーパークォーラムアドレスを設定します。
- hbase.zookeeper.property.clientPort -zookeeperクライアントポートを設定します。
問い合わせ
CREATE EXTERNAL TABLE students (rowkey text,id int,name text)
USING hbase WITH ('table' = 'students', 'columns' = ':key,info:id,content:name')
LOCATION 'hbase:zk://<hostname>:<port>/';
ここで、Location pathフィールドは、zookeeperクライアントのポートIDを設定します。 ポートを設定しない場合、Tajoはhbase-site.xmlファイルのプロパティを参照します。
HBaseでテーブルを作成する
次のクエリに示すように、「hbase shell」コマンドを使用して、HBaseインタラクティブシェルを起動できます。
問い合わせ
/bin/hbase shell
結果
上記のクエリは、次の結果を生成します。
hbase(main):001:0>
HBaseをクエリする手順
HBaseを照会するには、次の手順を完了する必要があります-
- ステップ1 *-次のコマンドをHBaseシェルにパイプして、「チュートリアル」テーブルを作成します。
問い合わせ
hbase(main):001:0> create ‘students’,{NAME => ’info’},{NAME => ’content’}
put 'students', ‘row-01', 'content:name', 'Adam'
put 'students', ‘row-01', 'info:id', '001'
put 'students', ‘row-02', 'content:name', 'Amit'
put 'students', ‘row-02', 'info:id', '002'
put 'students', ‘row-03', 'content:name', 'Bob'
put 'students', ‘row-03', 'info:id', ‘003'
- ステップ2 *-次に、hbaseシェルで次のコマンドを発行して、データをテーブルにロードします。
main):001:0> cat ../hbase/hbase-students.txt | bin/hbase shell
- ステップ3 *-Tajoシェルに戻り、次のコマンドを実行してテーブルのメタデータを表示します-
default> \d students;
table name: default.students
table path:
store type: HBASE
number of rows: unknown
volume: 0 B
Options:
'columns' = ':key,info:id,content:name'
'table' = 'students'
schema:
rowkey TEXT
id INT4
name TEXT
- ステップ4 *-テーブルから結果を取得するには、次のクエリを使用します-
- 問い合わせ *
default> select* from students
結果
上記のクエリは、次の結果を取得します-
rowkey, id, name
-------------------------------
row-01, 001, Adam
row-02, 002, Amit
row-03 003, Bob
Apache Tajo-Hiveとの統合
Tajoは、HiveCatalogStoreをサポートしてApache Hiveと統合します。 この統合により、TajoはApache Hiveのテーブルにアクセスできます。
環境変数を設定する
「conf/tajo-env.sh」ファイルに次の変更を追加します。
$ vi conf/tajo-env.sh
export HIVE_HOME =/path/to/hive
Hiveパスを含めた後、TajoはHiveライブラリファイルをクラスパスに設定します。
カタログ構成
「conf/catalog-site.xml」ファイルに次の変更を追加します。
$ vi conf/catalog-site.xml
<property>
<name>tajo.catalog.store.class</name>
<value>org.apache.tajo.catalog.store.HiveCatalogStore</value>
</property>
HiveCatalogStoreが設定されると、TajoのHiveのテーブルにアクセスできます。
Apache Tajo-OpenStack Swiftの統合
Swiftは、分散された一貫性のあるオブジェクト/ブロブストアです。 Swiftはクラウドストレージソフトウェアを提供しているため、シンプルなAPIで大量のデータを保存および取得できます。 TajoはSwift統合をサポートしています。
以下は、Swift Integrationの前提条件です-
- 迅速
- Hadoop
Core-site.xml
hadoop「core-site.xml」ファイルに次の変更を追加します-
<property>
<name>fs.swift.impl</name>
<value>org.apache.hadoop.fs.swift.snative.SwiftNativeFileSystem</value>
<description>File system implementation for Swift</description>
</property>
<property>
<name>fs.swift.blocksize</name>
<value>131072</value>
<description>Split size in KB</description>
</property>
これは、HadoopがSwiftオブジェクトにアクセスするために使用されます。 すべての変更を行ったら、Tajoディレクトリに移動して、Swift環境変数を設定します。
conf/tajo-env.h
Tajo構成ファイルを開き、次のように環境変数を設定して追加します-
$ vi conf/tajo-env.h
export TAJO_CLASSPATH = $HADOOP_HOME/share/hadoop/tools/lib/hadoop-openstack-x.x.x.jar
これで、TajoはSwiftを使用してデータをクエリできるようになります。
テーブルを作成
次のように、TajoのSwiftオブジェクトにアクセスするための外部テーブルを作成しましょう-
default> create external table swift(num1 int, num2 text, num3 float)
using text with ('text.delimiter' = '|') location 'swift://bucket-name/table1';
テーブルが作成された後、SQLクエリを実行できます。
Apache Tajo-JDBCインターフェース
Apache Tajoは、クエリを接続して実行するJDBCインターフェイスを提供します。 同じJDBCインターフェースを使用して、JavaベースのアプリケーションからTajoを接続できます。 このセクションのJDBCインターフェースを使用して、サンプルのJavaアプリケーションでTajoを接続し、コマンドを実行する方法を理解しましょう。
JDBCドライバーのダウンロード
次のリンクにアクセスしてJDBCドライバーをダウンロードします-http://apache.org/dyn/closer.cgi/tajo/tajo-0.11.3/tajo-jdbc-0.11.3.jar。
これで、「tajo-jdbc-0.11.3.jar」ファイルがマシンにダウンロードされました。
クラスパスを設定
プログラムでJDBCドライバーを使用するには、次のようにクラスパスを設定します-
CLASSPATH = path/to/tajo-jdbc-0.11.3.jar:$CLASSPATH
Tajoに接続
Apache TajoはJDBCドライバーを単一のjarファイルとして提供し、* @/path/to/tajo/share/jdbc-dist/tajo-jdbc-0.11.3.jar*で利用可能です。
Apache Tajoを接続するための接続文字列は次の形式です-
jdbc:tajo://host/
jdbc:tajo://host/database
jdbc:tajo://host:port/
jdbc:tajo://host:port/database
ここに、
- host -TajoMasterのホスト名。
- port -サーバーがリッスンしているポート番号。 デフォルトのポート番号は26002です。
- database -データベース名。 デフォルトのデータベース名はデフォルトです。
Javaアプリケーション
Javaアプリケーションについて理解しましょう。
コーディング
import java.sql.*;
import org.apache.tajo.jdbc.TajoDriver;
public class TajoJdbcSample {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
try {
Class.forName("org.apache.tajo.jdbc.TajoDriver");
connection = DriverManager.getConnection(“jdbc:tajo://localhost/default");
statement = connection.createStatement();
String sql;
sql = "select * from mytable”;
//fetch records from mytable.
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.print("ID: " + id + ";\nName: " + name + "\n");
}
resultSet.close();
statement.close();
connection.close();
}catch(SQLException sqlException){
sqlException.printStackTrace();
}catch(Exception exception){
exception.printStackTrace();
}
}
}
次のコマンドを使用して、アプリケーションをコンパイルおよび実行できます。
編集
javac -cp/path/to/tajo-jdbc-0.11.3.jar:. TajoJdbcSample.java
実行
java -cp/path/to/tajo-jdbc-0.11.3.jar:. TajoJdbcSample
結果
上記のコマンドは、次の結果を生成します-
ID: 1;
Name: Adam
ID: 2;
Name: Amit
ID: 3;
Name: Bob
ID: 4;
Name: David
ID: 5;
Name: Esha
ID: 6;
Name: Ganga
ID: 7;
Name: Jack
ID: 8;
Name: Leena
ID: 9;
Name: Mary
ID: 10;
Name: Peter
Apache Tajo-カスタム関数
Apache Tajoは、カスタム/ユーザー定義関数(UDF)をサポートしています。 カスタム関数はpythonで作成できます。
カスタム関数は、次のようにデコレータ*“ @ output_type(<tajo sql datatype>)” *を備えた単なるPython関数です-
@ouput_type(“integer”)
def sum_py(a, b):
return a + b;
UDFを使用したpythonスクリプトは、*“ tajosite.xml” *に以下の構成を追加することにより登録できます。
<property>
<name>tajo.function.python.code-dir</name>
<value>file:///path/to/script1.py,file:///path/to/script2.py</value>
</property>
スクリプトが登録されたら、クラスターを再起動すると、UDFが次のようにSQLクエリで利用可能になります-
select sum_py(10, 10) as pyfn;
Apache Tajoはユーザー定義の集計関数もサポートしていますが、ユーザー定義のウィンドウ関数はサポートしていません。