About Me

My photo
Software Engineer at Starburst. Maintainer at Trino. Previously at LINE, Teradata, HPE.

2017-12-02

Hive Study


Hadoopの象本を読み返してみています。2013年に出版された第3版ってことは、hpでデータ系の部署に配属された時に買ったんだっけな〜と朧げな記憶が蘇ります。今日はHiveの部分を重点的に。
Hiveは読み込み時点ではデータを確認せず、クエリの発行時に確認する。これを読み込み時のスキーマ適用と呼ぶ。
compact/bitmapインデックス
compact: 各ファイル内のオフセットではなく、HDFSのブロック番号を保存する。値が近傍の行にまとまっているような場合に効果的
bitmap: 特定の値が現れている行を、圧縮されたビット集合を使って保存数r。通常はカーディナリティの低い列に対して使用する
HiveQLはSQL92への準拠がゴールとして設定されたことはなく、ユーザーの要求を満たせるように機能追加してきた。
管理対象/外部テーブル
管理対象: load data inpathは移動を伴う、dropはメタデータとデータそのものを削除する
外部テーブル: テーブル作成時にlocationのパスをチェックしない、dropはメタデータのみを削除する  
バケット
同じ列でバケット化された2つのテーブルの結合処理は、map側結合として効率的に実装できる。

create table bucketed_users (id int, name string)
clustered by (id) into 4 buckets
;
create table bucketed_users (id int, name string)
clustered by (id) sorted by (id asc) into 4 buckets
;
select * from bucketed_users
tablesample(bucket 1 out of 4 on id)
;

複数テーブルへのinsert

from s1
insert overwrite table t1
 select c1, count(c1)
 group by c1
insert overwrite table t2
 select c2, count(c2)
 group by c2
;   

空テーブルの複製

create table t1_new like t1
;

ソート
sort by: reducer毎にソートされたファイルを生成する distribute by: 特定の行がどのreducerに行くのかを制御する

from records2
select year, temperature
distribute by year
sort by year asc, temperature desc
;

関数の確認

show functions
;
describe function length
;

map結合 1つのテーブルがメモリに収まるほど小さければ、小さい方のテーブルをmapperのメモリに読み込んで結合処理を行うことができる。

select /**+ MAPJOIN(things) */ sales.*, things.*
from sales
 join things on (sales.id = things.id)
;

ビュー
生成時点ではディスクにマテリアライズ化されず、ビューの参照時点で、ビューのselect文が実行される。
ユーザー定義関数
UDF: 1つの行を受け取り、1つの出力行を生成する
UDAF(User-Defined Aggregate Function): 複数行を受け取り、1つの出力行を生成する
UDTF(User-Defined Table-generating Function): 1つの行に対して処理を行ない、複数行を出力する
UDFを作成する際はorg.apache.hadoop.hive.ql.exec.UDFをextendsし、最低限evaluateメソッドを実装する必要がある Hiveへの登録するにはjarファイルとしてパッケージ化し、add jarおよびcreate temporary functionを実行する
add jar /path/to/hive-examples.jar
create temporary function strip as 'com.hadoopbook.hive.strip'

(UDAFの作成方法はUDFと異なる部分もあるが割愛)