"programming hive" reading #1
DESCRIPTION
TRANSCRIPT
“Programming Hive” Reading #1
“Programming Hive” Reading #1
Today’s Agenda
•Chapter4. Data Difinition
•PARTITION / BUCKET
•Chapter6. Queries
•SELECT / WHERE / JOIN / DISTRIBUTE BY / CLUSTER BY / UNION ALL
•Chapter7. Views
•View
3
“Programming Hive” Reading #1
Hive
4
http://www.learncomputer.com/hadoop-with-hive/
“Programming Hive” Reading #1
Chapter4. Data Definition
•基本的な事項は割愛
•PARTITION / BUCKET のみ触れます。
5
“Programming Hive” Reading #1
PARTITIONED BY
•特定のカラムでデータのパーティショニング。
•HDFS上では指定したカラムの値ごとにディレクトリが分離される。
6
“Programming Hive” Reading #1
Dynamic Partition
•INSERT時にPARTITION対象のカラムを指定することも可能
•使用するためには設定が必要hive.exec.dynamic.partition=true
7
“Programming Hive” Reading #1
Bucketing Table
•特定のカラムをキーに、あらかじめ用意したBucketにごとにデータを振り分ける。(上記は、user_idをキーに96のBucketにデータを振り分ける、の意)
•使用するためには設定が必要hive.enforce.bucketing=truemapred.reduce.tasks = [int]
8
“Programming Hive” Reading #1
Chapter6. Queries
9
操作 HiveQL SQL
検索 SELECT SELECT
更新 - UPDATE
挿入 INSERT OVERWRITE TABLEINSERT INTO TABLE INSERT INTO
削除 - DELETE FROM
※『はじめてのHadoop』P245より引用加筆
“Programming Hive” Reading #1
Chapter6. Queries
10
カテゴリ HiveQL 備考整数型 TINYINT 1バイト
SMALLINT 2バイト
INT 4バイト
BIGINT 8バイト
浮動小数点型 FLOAT 4バイト
DOUBLE 8バイト
文字列型 STRING
真偽値 BOOLEAN TRUE/FALSE
配列型 ARRAY hoge[0]
MAP型 MAP hoge[‘fuga’]
構造体型 STRUCT hoge.fuga
※『はじめてのHadoop』P245より引用加筆
“Programming Hive” Reading #1
SELECT:Functions
11
Nameround(double a)round(double a, int d)floor(double a)ceil(double a), ceiling(double a)rand(), rand(int seed)exp(double a)ln(double a)log10(double a)log2(double a)・・・
※詳細はHiveのWikiを参照ください。https://cwiki.apache.org/Hive/languagemanual-udf.html
“Programming Hive” Reading #1
SELECT:Table Generating Functions
12
Function 備考
explode()SELECT explode(myCol) AS myNewCol FROM myTable;#myCol : [1,2,3][4,5,6]#myNewCol : 1 2 3 4 5 6
json_tuple()select a.timestamp, b.*from log a lateral view json_tuple(a.appevent, 'eventid', 'eventname') b as f1, f2;
parse_url_tuple() SELECT parse_url_tuple(url, ‘HOST’,‘PATH’.‘QUERY’) as (host, path, query) FROM url_table
“Programming Hive” Reading #1
json_tuple memo
•json_tuple()• http://javasourcecode.org/html/open-source/hive/hive-0.9.0/org/
apache/hadoop/hive/ql/udf/generic/GenericUDTFJSONTuple.java.html
•JSONObject
•Hive-JSON-Serde• https://github.com/rcongiu/Hive-JSON-Serde/blob/master/src/main/
java/org/openx/data/jsonserde/JsonSerDe.java
•org.openx.data.jsonserde.JsonSerDe(独自実装)
13
“Programming Hive” Reading #1
SELECT:When Hive Can Avoid M/R
•以下の条件に合致する場合はMapReduceが起動しない(HDFSへのシーケンシャルアクセス)
•From句ならびにWhere句が指定されてない時
•SELECT * FROM employees;
•From句が未指定で、Where句にパーティション用のカラムが指定されている時
•SELECT * FROM employees WHERE country = ‘USA’ and state = ‘CA’;
14
“Programming Hive” Reading #1
WHERE:Predicate Operations
15
NameA = BA <=> BA <> BA < BA <= BA > BA >= BA [NOT] BETWEEN B AND CA IS NULLA IS NOT NULLA LIKE BA RLIKE BA REGEXP B
“Programming Hive” Reading #1
WHERE:RLIKE/REGEXP
•正規表現を用いてあいまい検索
•LIKE
•RLIKE
16
“Programming Hive” Reading #1
JOIN
•Inner JOIN
•LEFT OUTER JOIN
•RIGHT OUTER JOIN
•FULL OUTER JOIN
•LEFT SEMI-JOIN
17
“Programming Hive” Reading #1
Map Side Join
•Map処理のみを用いてJOINを行う事を強制する。メモリ上に指定したテーブルのデータ(上記例の場合は”b”)を読み込むため、小さめのデータでの使用を推奨。※上記記法は0.7以降ではdeprecated
•RIGHT OUTER JOIN / FULL OUTER JOIN では使用できない
18
“Programming Hive” Reading #1
Map Side Join
19
•hive.auto.convert.join=[true|false]
•JOIN最適化を有効にする。JOINの際片方のテーブルサイズが小さい場合はMap Side Join。
•hive.mapjoin.smalltable.filesize=[int]
•指定したサイズよりデータが小さい場合、一般的なM/R処理でなくMap Side Joinが行われる。
※参考: http://d.hatena.ne.jp/wyukawa/20120328/1332950392http://d.hatena.ne.jp/wyukawa/20110818/1313670105
“Programming Hive” Reading #1
DISTRIBUTE BY
•DISTRIBUTE BY句で指定したカラムのデータのうち、同値の場合は必ず同じReducerに振り分けられる事を保証する。
20
“Programming Hive” Reading #1
CLUSTER BY
•DISTRIBUTE BY句とSORT BY句で同じカラムを指定するのと同じ動作になる。
21
“Programming Hive” Reading #1
•全体のデータからサンプリングをして特定の比率のデータを取得する。
•上記は全体データを10のBucketに分類し、そのうち3つのBucketを抽出する、の意。
Sampling
22
“Programming Hive” Reading #1
•TABLESAMPLE(0.1 PERCENT)
•全データから0.1%のデータを抽出する。
•TABLESAMPLE(100M)
•全データから100MB分のデータを抽出
•TABLESAMPLE(100 ROWS)
•全データから100行のデータを抽出
Block Sampling
23
https://cwiki.apache.org/Hive/languagemanual-sampling.html
“Programming Hive” Reading #1
•Hiveでは副問い合わせの時のみ使用可能。
•UNION ALLでは必ず副問い合わせ文の数分Full Scanになるので、ORやCASE...WHEN...THEN 構文で記載できる場合はそちらの方が処理が速い。
UNION ALL
24
“Programming Hive” Reading #1
UNION ALL
25
SELECT log.ymd, log.level, log.message FROM ( SELECT l1.ymd, l1.level, l1.message FROM log l1 WHERE l1.type = 'A' UNION ALL SELECT l2.ymd, l2.level, l2.message FROM log l2 WHERE l2.type = 'B' ) logSORT BY log.ymd ASC;
SELECT ymd, level, message FROM log WHERE type = ‘A’ OR type = ‘B’ SORT BY log.ymd ASC;
STAGE PLANS: Stage: Stage-1 Map Reduce Alias -> Map Operator Tree: null-subquery1:log-subquery1:m1 TableScan (中略) null-subquery2:log-subquery2:m2 TableScan (中略) Union Select Operator (後略)
STAGE PLANS: Stage: Stage-1 Map Reduce Alias -> Map Operator Tree: TableScan (中略) Select Operator (後略)
“Programming Hive” Reading #1
•Viewからデータを参照する際は、DDLで定義したSELECT~文が発行される。
•上記クエリー発行時は、・”SELECT * FROM people~” でscanしつつ・”SELECT lastname FROM shorter_join~”の条件でデータを抽出する
Chapter7. View
26
“Programming Hive” Reading #1
Chapter7. View
27
STAGE DEPENDENCIES: Stage-1 is a root stage Stage-0 is a root stage
STAGE PLANS: Stage: Stage-1 Map Reduce Alias -> Map Operator Tree: hoge_view:hoge_source TableScan alias: hoge_source Filter Operator (中略) Select Operator (中略) Select Operator (中略) Limit File Output Operator compressed: false GlobalTableId: 0 table: input format: org.apache.hadoop.mapred.TextInputFormat output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Stage: Stage-0 Fetch Operator limit: 10