Apache Hiveは、SQLに似た言語(HiveQL)を使用して、データの抽出や変換などを行うことができます。しかし、Hiveは処理にMapReduceを使用しており、大規模データのバッチでの処理や、チュートリアル3(後述)のような柔軟な処理には適していますが、一般的に処理に時間がかるため、繰り返し分析を行うような用途に利用するのは難しいでしょう。
Cloudera Impalaは、大規模データのための高速なSQLエンジンです。残念ながらこのチュートリアルではその本来の力を発揮することができませんが、数十TBもの大量データに対するクエリでも、今回と同じ操作で同じように分析を行うことができることは覚えておいてください。
Impalaについての詳細は、以下のスライドを参考にしてください。
チュートリアル2:Impalaを使って高速にデータを分析する
まず、前回設定した仮想マシンを起動します。続いて「http://<VMのIPアドレス>:8888/impala/」にアクセスし、HueのImpalaクエリエディタを開きます。
ImpalaとHiveとはスキーマを共有しています。Impalaはスキーマをキャッシュしているので、Hiveからスキーマを変更した場合、INVALIDATE METADATAを実行してImpalaにスキーマ変更を通知しなければいけません。以下のコマンドを実行してください。
INVALIDATE METADATA;
なお、クエリの入力時にCTRL+スペースキーを押すことで、キーワードの自動補完を行うことができます。
最も売上の多い商品カテゴリ
まずは、一般的なRDBMSで行うことのできる分析クエリを試してみます。以下のクエリを実行し、注文データから「最も売上の多い商品カテゴリ」を算出してみます。
-- Most popular product categories select c.category_name, count(order_item_quantity) as count from order_items oi inner join products p on oi.order_item_product_id = p.product_id inner join categories c on c.category_id = p.product_category_id group by c.category_name order by count desc limit 10;
結果が出力されたら、「チャート」タブをクリックしてみましょう。結果をグラフ表示することができます。
次は、売上トップ10の商品を計算するクエリを実行します。
-- top 10 revenue generating products select p.product_id, p.product_name, r.revenue from products p inner join (select oi.order_item_product_id, sum(cast(oi.order_item_subtotal as float)) as revenue from order_items oi inner join orders o on oi.order_item_order_id = o.order_id where o.order_status <> 'CANCELED' and o.order_status <> 'SUSPECTED_FRAUD' group by order_item_product_id) r on p.product_id = r.order_item_product_id order by r.revenue desc limit 10;
実行したクエリの履歴は保存されているので、後からクエリを呼び出して再実行することができます。