programming hive chapter 6

43
Programming Hive hive本勉強会 6HiveQL: Queries 大槌 剛彦 (@ohtsuchi)

Upload: ohtsuchi

Post on 10-May-2015

3.298 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Programming Hive CHAPTER 6

Programming Hive

hive本勉強会 第6章 HiveQL: Queries

大槌 剛彦 (@ohtsuchi)

Page 2: Programming Hive CHAPTER 6

初めに

• SQLの予備知識がある前提で説明します。

– 一部の内容は割愛しています。

• (例) → 本書に記述してあるSQL文から全て、または一部を抜粋した内容

Page 3: Programming Hive CHAPTER 6

この章の内容

• SELECT … FROM Clauses • WHERE Clauses • GROUP BY Clauses • JOIN Statements • ORDER BY and SORT BY • DISTRIBUTE BY with SORT BY • CLUSTER BY • Casting • Queries that Sample Data • UNION ALL

Page 4: Programming Hive CHAPTER 6

SELECT … FROM Clauses

• FROM句 – テーブル, View, nested query

• (例) – SELECT name, salary FROM employees;

• テーブル名のエイリアス(別名)

– employees e;

Page 5: Programming Hive CHAPTER 6

SELECT … FROM Clauses

collection types • Output

– JSON 形式

– ARRAY • (例) employees テーブルの subordinates カラム

– [ "Mary Smith" , "Todd Jones" ]

– MAP • (例) employees テーブルの deductions カラム

– { "Federal Taxes”:0.2 , "State Taxes":0.05 , "Insurance":0.1 }

– STRUCT • (例) employees テーブルの address カラム

– { "street":"1 Michigan Ave." , "city":"Chicago" , "state":"IL" , "zip":60600 }

• 参照 – ARRAY

• 0から始まるindex指定 • (例) subordinates[0]

– MAP • [キー値]指定 • (例) deductions["State Taxes"]

– STRUCT • ドットで指定 • (例) address.city

Page 6: Programming Hive CHAPTER 6

SELECT … FROM Clauses

Specify Columns with Regular Expressions

• カラム名の指定に正規表現を利用可能 – (例) “price”から始まる名前のカラム全て (テーブル定義は p56)

• `price.*`

• 正規表現に関しては “LIKE and RLIKE”(p96)でも説明

CREATE EXTERNAL TABLE IF NOT EXISTS stocks ( exchange STRING, symbol STRING, ymd STRING, price_open FLOAT, price_high FLOAT, price_low FLOAT, price_close FLOAT, volume INT, price_adj_close FLOAT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/data/stocks';

hive> SELECT symbol, `price.*` FROM stocks; AAPL 195.69 197.88 194.0 194.12 194.12 AAPL 192.63 196.0 190.85 195.46 195.46 AAPL 196.73 198.37 191.57 192.05 192.05 AAPL 195.17 200.2 194.42 199.23 199.23 AAPL 195.91 196.32 193.38 195.86 195.86

Page 7: Programming Hive CHAPTER 6

SELECT … FROM Clauses

Computing with Column Values Arithmetic Operators

• 関数や算術式を利用することで値の操作が可能

• Arithmetic Operators

– +, -, *, /, %, &, |, ^, ~

– 2つのオペランドは同じ型でなくても良い

• 異なる型の場合は、小さい方の型が、もう一方の大きい型に変換される

– INT と BIGINT の場合

• INT → BIGINT – INT と FLOATの場合

• INT → FLOAT

– (例) (1 - deductions["Federal Taxes"])

• 1 → FLOAT (deductions カラムが FLOAT なので)

– overflow または underflow に注意!

• 乗算や除算の時など起こりやすい

• 心配ならば、大きい方の型を使う

– 欠点:余分にメモリ使う

– 型の変換には cast 関数もある (p102)

Page 8: Programming Hive CHAPTER 6

SELECT … FROM Clauses

Using Functions … Mathematical functions

• Table 6-2 – 四捨五入, 乱数, 累乗, 16進数表記, etc…

– ※詳細は割愛…

• 浮動小数点型 を integer に変換する場合

– cast 演算子 を使うよりも、floor, round, ceil 関数を使う方が望ましい

Page 9: Programming Hive CHAPTER 6

SELECT … FROM Clauses

Using Functions … Aggregate functions

• 多くのrowに対して計算を行った1つの結果を返す

• 正確にはこの関数は、User Defined Aggregate Function (p164)

• (例) count(*), avg(salary)

• GROUP BY の例は p97

• Table 6-3 – count, sum, avg, min, max, 分散, 標準偏差, 相関, 百分率, etc...

– ※詳細は割愛…

• hive.map.aggr を true – 集約のパフォーマンスが上がる

– Mapフェーズでtop-levelの集約をする? • (ちょっと意味がよく分からなかったです…

• > This setting will attempt to do “top-level” aggregation in the map phase, )

– →より多くのメモリが必要

Page 10: Programming Hive CHAPTER 6

SELECT … FROM Clauses

Using Functions … Aggregate functions

• function(DISTINCT …) – いくつかの集約関数では DISTINCT を指定可能

– (例) count(DISTINCT symbol) • symbol のユニーク数

– partition カラムを指定した場合のバグ有り

• 上の例では結果が0

– wiki では、1クエリ内で、2個以上のfunction(DISTINCT …)が使えないと。

• 実際には使える

• (例) count(DISTINCT ymd), count(DISTINCT volume)

hive> SELECT count(DISTINCT symbol) FROM stocks; 0

hive> SELECT count(DISTINCT ymd), count(DISTINCT volume) FROM stocks; 12110 26144

Page 11: Programming Hive CHAPTER 6

SELECT … FROM Clauses

Using Functions … Table generating functions

• 集約関数の「逆」 – 1カラム → 複数のカラム or 行に 拡張

– 詳細は p165

• (例) explode(subordinates) AS sub

– 0レコード or 複数レコード に展開される

– カラムエイリアス(例ではsub)が必須

• Table 6-4 – ※すみません。こちらも時間無かったので割愛で。。

hive> SELECT explode(subordinates) AS sub FROM employees; Mary Smith Todd Jones Bill King

Page 12: Programming Hive CHAPTER 6

SELECT … FROM Clauses

Using Functions … Other built-in functions

• 文字列、map, array, JSON, timestamp の操作

• Table 6-5 – 文字列操作, 日付関数, etc...

– ※詳細は割愛…

• 時間関数 は integer or string の引数 – v0.8.0 から TIMESTAMP 型 を引数に取ることができる関数がある。

– 後方互換性のために integer or string の引数を引き続き使用可。

Page 13: Programming Hive CHAPTER 6

SELECT … FROM Clauses

LIMIT Clause, Column Aliases, Nested SELECT Statements,

CASE … WHEN … THEN Statements

• ※SQL知ってる人なら分かると思いますので、以下、割愛します。。

• LIMIT Clause – 結果の行数を制御

• Column Aliases – カラム別名

• Nested SELECT Statements – FROM句の中にSELECT文

• CASE … WHEN … THEN Statements

Page 14: Programming Hive CHAPTER 6

SELECT … FROM Clauses

When Hive Can Avoid MapReduce

• HiveQL を実行すると、ほとんどの場合、MRが実行される

• MRが走らない場合 → local mode と呼ばれる

• (例) カラム名を指定しない、WHEREを指定しない – SELECT * FROM employees;

• (例) WHERE で partition キーのみ指定 – WHERE country = 'US' AND state = 'CA‘

• 上記以外でも、hive.exec.mode.local.auto を true にすると local mode で実行しようとする

• それ以外の場合は、全てのHiveQLでMRが走る

Page 15: Programming Hive CHAPTER 6

WHERE Clauses

• (例) SELECT句とWHERE句で同じ predicate expressions (述語式)

– SELECT …

– salary * (1 - deductions["Federal Taxes"])

– WHERE round(salary * (1 - deductions["Federal Taxes"])) > 70000

• (例) 上記が冗長なので、SELECT句でエイリアス使用 → エラーになる

– SELECT …

– salary * (1 - deductions["Federal Taxes"]) as salary_minus_fed_taxes

– WHERE round(salary_minus_fed_taxes) > 70000;

• ※WHERE句で、SELECT句で付けたエイリアスを使用することは出来ない

• (例) nested SELECT を使用

– SELECT e.* FROM

– (SELECT …

– salary * (1 - deductions["Federal Taxes"]) as salary_minus_fed_taxes

– FROM employees) e

– WHERE round(e.salary_minus_fed_taxes) > 70000;

Page 16: Programming Hive CHAPTER 6

WHERE Clauses

Predicate Operators • Table 6-6

– = , <>, etc... – ※詳細は割愛…

• LIKE, RLIKE は p96

Page 17: Programming Hive CHAPTER 6

WHERE Clauses

Gotchas with Floating-Point Comparisons

• 異なる型の浮動小数点型の比較 – すなわち、 FLOAT と DOUBLE の比較

– (例) 0.2 より 大きい、と指定しているのに、 0.2 の行も返る

• WHERE deductions['Federal Taxes'] > 0.2

• これはバグであるが、浮動小数点型の内部の実装の振る舞い

• 全てのソフトウェア、ほとんどの言語で影響

hive> SELECT name, salary, deductions['Federal Taxes'] > FROM employees WHERE deductions['Federal Taxes'] > 0.2; John Doe 100000.0 0.2 Mary Smith 80000.0 0.2 Boss Man 200000.0 0.3 Fred Finance 150000.0 0.3

Page 18: Programming Hive CHAPTER 6

WHERE Clauses

Gotchas with Floating-Point Comparisons • 異なる型の浮動小数点型の比較

– 0.2 のように リテラル値 で指定した場合

• → DOUBLE 型として扱われる

– deductions カラムの定義は FLOAT 型

• 比較のために暗黙的に変換される

– 0.2 は FLOAT 型 でも DOUBLE 型でも正確に表現できない

• カラム定義 0.2 (FLOAT) → 0.2000001

• リテラル値 0.2 (DOUBLE) → 0.200000000001

– オペランドが異なる型の場合は、小さい方の型が、拡張される

• (Arithmetic Operators 参照)

• カラム定義0.2 (FLOAT→DOUBLE) → 0.200000100000

• リテラル値 0.2 (DOUBLE) → 0.200000000001

– よって、 deductions カラムの 0.2 > リテラル値の 0.2 が成り立つ

– この問題は、Hiveやjava特有ではなく、 IEEEの浮動小数点数を使用している全てのシステムが該当する

Page 19: Programming Hive CHAPTER 6

WHERE Clauses

Gotchas with Floating-Point Comparisons • 回避策は2つ

– (1)カラムの定義を DOUBLE 型 に。

• メモリ使用量は増える

• バイナリ形式の場合(SEQUENCEFILEなど)、簡単に変えられない

– (2)リテラル値の方を明示的に FLOAT に変換。 • 後ろに f を付ける構文 (例 0.2f)は、hiveでは未サポート

• cast 演算子 を利用

– (例) WHERE deductions['Federal Taxes'] > cast(0.2 AS FLOAT);

– (3)3番目の回避策も。。

• 浮動小数点型を使わない。お金関連とか。

• 浮動小数点型の比較には特別な注意を払う

• 暗黙的な型変換(smaller to wider types)を避ける

hive> SELECT name, salary, deductions['Federal Taxes'] FROM employees > WHERE deductions['Federal Taxes'] > cast(0.2 AS FLOAT); Boss Man 200000.0 0.3 Fred Finance 150000.0 0.3

Page 20: Programming Hive CHAPTER 6

WHERE Clauses

LIKE and RLIKE • Table 6-6 (p94)

• LIKE

– SQLのLIKEと同様

– '%', '_‘

• RLIKE

– javaの正規表現を利用可能

– より rich な表現

• (例) RLIKE でOR条件の正規表現の例と、LIKEを2個使った例

– WHERE address.street RLIKE '.*(Chicago|Ontario).*‘

– WHERE address.street LIKE '%Chicago%' OR address.street LIKE '%Ontario%‘

• 正規表現の詳細は PatternクラスのAPI仕様や、O'Reilly の書籍参照(p97)

Page 21: Programming Hive CHAPTER 6

GROUP BY Clauses, HAVING Clauses

• GROUP BY – (例) 年ごとの平均

• SELECT year(ymd), avg(price_close) …

• …

• GROUP BY year(ymd);

• HAVING Clauses – GROUP BY グループ化された結果を絞り込む

– サブクエリでも表現できるが、HAVINGを使えばより簡潔に表現できる

Page 22: Programming Hive CHAPTER 6

JOIN Statements Inner JOIN

• ON句で次の2つはサポートしない

– 不等号による結合(<, >)

• 一般的なSQLでは可能だが、Hiveではサポートしない

• (例) Example 6-1

– ON a.ymd <= b.ymd

• MapReduceで実装するのが難しいため

• Pig の cross product feature を使えば可能?

– OR の使用

SELECT a.ymd, a.price_close, b.price_close FROM stocks a JOIN stocks b ON a.ymd <= b.ymd WHERE a.symbol = 'AAPL' AND b.symbol = 'IBM'

Page 23: Programming Hive CHAPTER 6

JOIN Statements Inner JOIN

• (例) 3つ結合。stocksテーブル。自己結合。 (a='AAPL') (b='IBM') (c='GE') – SELECT …

– FROM stocks a JOIN stocks b ON a.ymd = b.ymd

– JOIN stocks c ON a.ymd = c.ymd

– WHERE a.symbol = 'AAPL' AND b.symbol = 'IBM' AND c.symbol = 'GE';

• ほとんどの場合、JOIN の組単位で 別々のMapReduce jobが走る

– 前の例では、

• (a) と (b) の JOIN

• (上のJOIN 結果)と (c) の JOIN

– Hiveはクエリの左から右へ評価する

• (b) と (c) の JOIN が先に発生しない

– このSQL例では、次に紹介する最適化を利用している

Page 24: Programming Hive CHAPTER 6

JOIN Statements Join Optimizations

• 3つ以上のJOINの場合に、全てのON句で、同じJOIN キーを指定

– 前の例では、

• ON a.ymd = b.ymd

• ON a.ymd = c.ymd

– 3つのJOINを1つのMapReduce job に実行する最適化を適用

– a の 代わりに b

• ON b.ymd = a.ymd

• ON b.ymd = c.ymd

– と指定してもOK

Page 25: Programming Hive CHAPTER 6

JOIN Statements Join Optimizations

• JOINの最後のテーブルが、一番大きなテーブルとみなされる

– 最後のテーブルがストリーミングされながらJOINされる

– JOINの最後のテーブルには、一番大きなテーブルを指定すべき

– 前に出てきた例

• ミスを犯している

– サイズの小さな dividends を最後にしている

– JOINの順番を逆にすべき

• ヒント句を使えば、JOINの最後に、一番大きなテーブルを指定しなくても良い

– (例) /*+ STREAMTABLE(s) */

– 他、重要な最適化としては、map-side join

SELECT s.ymd, s.symbol, s.price_close, d.dividend FROM stocks s JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol WHERE s.symbol = 'AAPL';

SELECT /*+ STREAMTABLE(s) */ s.ymd, s.symbol, s.price_close, d.dividend FROM stocks s JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol WHERE s.symbol = 'AAPL';

Page 26: Programming Hive CHAPTER 6

JOIN Statements LEFT OUTER JOIN

• 条件にマッチしたJOIN左側のテーブルの結果が全て返る

• JOIN右側のテーブルに存在しない場合 → SELECT句の右側の各カラム=NULLで返る

Page 27: Programming Hive CHAPTER 6

JOIN Statements OUTER JOIN Gotcha

• (例) 前の LEFT OUTER JOIN の例に、 WHERE条件で partition filter(exchangeカラム)を追加する事で、クエリのspeed up を図る

– しかし、結果が inner join と同じ結果に

– →ほとんどのSQLに共通に見られる現象

– 理由:JOINが先に評価され、その結果(左側stocksテーブルのみ存在するレコードは d.exchange IS NULL)が、WHEREに渡されるため、(左側stocksテーブルのみ存在するレコード) に対して、 WHERE の (d.exchange = 'NASDAQ') の条件はfalseになる

hive> SELECT s.ymd, s.symbol, s.price_close, d.dividend > FROM stocks s LEFT OUTER JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol > WHERE s.symbol = 'AAPL' > AND s.exchange = 'NASDAQ' AND d.exchange = 'NASDAQ‘;

stocks s LEFT OUTER JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol

stocks s dividends d

WHEREで絞り込み d.exchange = 'NASDAQ’

d.exchange IS NULL

Page 28: Programming Hive CHAPTER 6

JOIN Statements OUTER JOIN Gotcha

• 簡単な解決策 – (例) WHERE の (d.exchange = 'NASDAQ') の条件を外す

• → 期待する結果ではない

• WHERE の条件を ON 句に移動してみれば? – → wiki では動く、と書いてあるが、 outer join では動かない

– (例) WHERE 句の条件を全て ON 句に移動

• ON s.ymd = d.ymd AND s.symbol = d.symbol

• AND s.symbol = 'AAPL' AND s.exchange = 'NASDAQ' AND d.exchange = 'NASDAQ';

• symbol =‘GE’が出力されている

• → symbol の絞りこみが効いてない

• partition filter は、OUTER JOIN では無視される

hive> SELECT s.ymd, s.symbol, s.price_close, d.dividend > FROM stocks s LEFT OUTER JOIN dividends d > ON s.ymd = d.ymd AND s.symbol = d.symbol > AND s.symbol = 'AAPL' AND s.exchange = 'NASDAQ' AND d.exchange = 'NASDAQ'; ... 1962-01-02 GE 74.75 NULL

Page 29: Programming Hive CHAPTER 6

JOIN Statements OUTER JOIN Gotcha

• 解決策: nested SELECT を使う

hive> SELECT s.ymd, s.symbol, s.price_close, d.dividend FROM > (SELECT * FROM stocks WHERE symbol = 'AAPL' AND exchange = 'NASDAQ') s > LEFT OUTER JOIN > (SELECT * FROM dividends WHERE symbol = 'AAPL' AND exchange = 'NASDAQ') d > ON s.ymd = d.ymd; ... 1988-02-10 AAPL 41.0 NULL 1988-02-11 AAPL 40.63 NULL 1988-02-12 AAPL 41.0 0.02 1988-02-16 AAPL 41.25 NULL 1988-02-17 AAPL 41.88 NULL ...

Page 30: Programming Hive CHAPTER 6

JOIN Statements RIGHT OUTER JOIN, FULL OUTER JOIN

• RIGHT OUTER JOIN

– LEFT OUTER JOIN の逆

• FULL OUTER JOIN

– WHERE句でマッチした、JOINした全テーブルのレコード

Page 31: Programming Hive CHAPTER 6

JOIN Statements LEFT SEMI-JOIN

• より一般的な inner join の特殊な最適化されたケース。

• SQLでサポートしている、 IN や EXISTS と同じ事をする

• (例) Example 6-2 Hiveでは動かない例

– SELECT …

– WHERE s.ymd, s.symbol IN

– (SELECT d.ymd, d.symbol FROM dividends d);

– 上の代わりに、LEFT SEMI JOIN 構文を使用する

• SELECT 句や WHERE 句で、右側のテーブルのカラムは指定できない

– Right semi-joins はサポートしない

Page 32: Programming Hive CHAPTER 6

JOIN Statements Cartesian Product JOINs

• 直積 – 左側5行、右側6行であれば、5×6 = 30行の結果

– 大量のデータが作成される

– MapReduceで 並行に動かない, 最適化されない

– 遅い、時間がかかる

• (例) ON句が無く、WHERE句でJOINの指定

– SELECT * FROM stocks JOIN dividends

– WHERE stock.symbol = dividends.symbol and stock.symbol='AAPL';

• SQL では inner join として、最適化されるが、

• → Hive では 直積として扱われてしまう

• hive.mapred.mode を strict に

– ユーザが気づかずに 直積のクエリを発行する事を防ぐ

• 直積のクエリがエラーになる

• strict mode については 10章で。(p137)

Page 33: Programming Hive CHAPTER 6

JOIN Statements Map-side Join

• 1つのテーブルを除いて、他の全てのテーブルが小さかった場合

– 小さいテーブル群はメモリにキャッシュされる

– 一番大きいテーブルが stream され、メモリのテーブル群と一致するか検査

– Mapサイドで全てJOIN出来る

– Reduce を省略できる

– 小さなデータでも、普通のJOIN より著しく早い

– Reduce を省略できるだけでなく、Mapのステップ数も減らせる

• v0.7 より前では、ヒント句の指定が必要 – (例) inner join を、ヒント句で Map-side Join で最適化

• SELECT /*+ MAPJOIN(d) */ s.ymd, …

• FROM stocks s JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol

• …

– dividends はメモリにキャッシュするのに十分な小ささ

– 著者の環境で、最適化されていないクエリーと比較して、おおよそ30%くらい早かった

Page 34: Programming Hive CHAPTER 6

JOIN Statements Map-side Join

• v0.7 から ヒント句 は deprecated

• hive.auto.convert.join を true

– Map-side Joins の最適化を試みてくれる

• hive.mapjoin.smalltable.filesize (単位=byte)

– メモリにキャッシュするテーブルのサイズの閾値

• right- and full-outer joins では未サポート

Page 35: Programming Hive CHAPTER 6

ORDER BY and SORT BY • ORDER BY

– 全てのデータが1つのreducerに渡される

– 受け入れがたいほどの長い時間がかかる事がある

• SORT BY

– 各reducer単位のソート

• (例) ORDER BY と SORT BY

– SELECT …

– FROM …

– ORDER BY s.ymd ASC, s.symbol DESC;

– SELECT …

– FROM …

– SORT BY s.ymd ASC, s.symbol DESC;

– 2つのクエリはほとんど同じに見えるが、reducerが2つ以上の場合、ソートの結果が異なる

• hive.mapred.mode を strict に

– ORDER BY を指定する時に、LIMIT句の指定が必須になる

Page 36: Programming Hive CHAPTER 6

DISTRIBUTE BY with SORT BY

• DISTRIBUTE BY – mapのoutputを制御 → 各reducer単位に分ける

– (例) 各 symbol 単位 で同一 reducer に分けた後、symbol と ymd でソート

• DISTRIBUTE BY s.symbol

• SORT BY s.symbol ASC, s.ymd ASC;

– GROUP BY と似た働き → reducer が受け取る row の制御

• SORT BY – 各reducer内のデータのソートを制御

hive> SELECT s.ymd, s.symbol, s.price_close > FROM stocks s > DISTRIBUTE BY s.symbol > SORT BY s.symbol ASC, s.ymd ASC; 1984-09-07 AAPL 26.5 1984-09-10 AAPL 26.37 1984-09-11 AAPL 26.87 1984-09-12 AAPL 26.12 …

Page 37: Programming Hive CHAPTER 6

CLUSTER BY

• 前の例では

– DISTRIBUTE BY = symbol

– SORT BY = symbol, ymd

• DISTRIBUTE BY と SORT BY (昇順) で同じカラムを指定する場合

– → CLUSTER BY が使える。

• (例) 前の例から、ymdのソートを除外

– DISTRIBUTE BY = symbol

– SORT BY = symbol

• CLUSTER BY s.symbol;

hive> SELECT s.ymd, s.symbol, s.price_close > FROM stocks s > CLUSTER BY s.symbol; 2010-02-08 AAPL 194.12 2010-02-05 AAPL 195.46 2010-02-04 AAPL 192.05 2010-02-03 AAPL 199.23 …

Page 38: Programming Hive CHAPTER 6

Casting, Casting BINARY Values

• Casting – cast 関数

• 明示的な型変換

• cast(value AS TYPE)

• 変換出来なかった場合はNULLを返す

– 浮動小数点型 を integer に変換する場合

• cast 演算子 を使うよりも、floor, round, ceil 関数を使う方が望ましい

• Casting BINARY Values – v0.8.0 から導入

Page 39: Programming Hive CHAPTER 6

Queries that Sample Data

• とても大きなデータの場合、

– 全データではなく、クエリ結果の代表的なサンプル、を扱いたい時 • bucket に編成したサンプルテーブル

• (例) 1~10の値が格納されている10行のテーブル(numbers)

– 分母=10

– 分子=3

– rand() 実行

• hive> SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON rand()) s;

• 2

• 4

• hive> SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON rand()) s;

• 7

• 10

• hive> SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON rand()) s;

– 実行毎に、BUCKET 3 の結果はランダムに。

» 1回目=2,4

» 2回目=7,10

» 3回目=無し

Page 40: Programming Hive CHAPTER 6

Queries that Sample Data • (例) 1~10の値が格納されている10行のテーブル(numbers)

– 分母=10

– 分子=3 と 5

– ON カラム名 指定 (カラム名=number)

• hive> SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON number) s;

• 2

• hive> SELECT * from numbers TABLESAMPLE(BUCKET 5 OUT OF 10 ON number) s;

• 4

• hive> SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON number) s;

• 2

• → 何度実行しても、同一の結果を返す

– BUCKET 3 -> 2

– BUCKET 5 -> 4

• 分母 – 各データがhashされて格納されるbucketの数(the number of buckets into which data will be

hashed)を表す。

• 分子 – SELECTする bucket number (the bucket number selected)

Page 41: Programming Hive CHAPTER 6

Queries that Sample Data Block Sampling

• パーセントを指定した sampling

– SELECT * FROM numbersflat TABLESAMPLE(0.1 PERCENT) s

• 1番小さい単位=HDFSブロックのサイズ

– テーブルのサイズが、HDFSブロックのサイズより小さい場合は、全行が返る

• seedの変更

– <name>hive.sample.seednumber</name>

– 変更すると、結果セットも変わる

Page 42: Programming Hive CHAPTER 6

Queries that Sample Data Input Pruning for Bucket Tables

• TABLESAMPLE 構文は、テーブルの全てをscan → N th row を selectする • TABLESAMPLE 構文で指定するカラムが、 CLUSTERED BY 句と 一致 する場合

– → TABLESAMPLE 構文 は, テーブル内の、必要な hash partition のみ scan する • (例)

– 分母=3, 分子=2, ON カラム名(number)指定

• hive> CREATE TABLE numbers_bucketed (number int) CLUSTERED BY (number) INTO 3 BUCKETS;

• hive> SET hive.enforce.bucketing=true;

• hive> INSERT OVERWRITE TABLE numbers_bucketed SELECT number FROM numbers;

• hive> dfs -ls /user/hive/warehouse/mydb.db/numbers_bucketed; • /user/hive/warehouse/mydb.db/numbers_bucketed/000000_0 • /user/hive/warehouse/mydb.db/numbers_bucketed/000001_0 • /user/hive/warehouse/mydb.db/numbers_bucketed/000002_0

• hive> dfs -cat /user/hive/warehouse/mydb.db/numbers_bucketed/000001_0; • 1 • 7 • 10 • 4

• hive> SELECT * FROM numbers_bucketed TABLESAMPLE (BUCKET 2 OUT OF 3 ON NUMBER) s; • 1 • 7 • 10 • 4

Page 43: Programming Hive CHAPTER 6

UNION ALL

• ※割愛します。。