【HiveQL】pyhiveとPrestoでテーブル操作
beeline
で実行していたクエリをpyhive
+ Presto
で再実装した際に書き方が違う部分があった為、備忘メモ。
LOCATIONを指定してテーブル作成
元のクエリはこちら。
CREATE EXTERNAL TABLE <テーブル名> (<カラム名> <型>, ...) ROW FORMAT DELIMITED FIELDS TERMINATED BY <区切文字、eg. '\t'> LOCATION <HDFSのパス>
pyhive
+ Presto
で書くと以下のようになる。
cursor = presto.connect(...).cursor() query = "CREATE TABLE test_table (id integer, note varchar) WITH (format='TEXTFILE', textfile_field_separator='\t', external_location='/path/to/hdfs')" cursor.execute(query) # fetchしないとテーブル作成後の処理が上手くいかない、エラーログも見れる print(cursor.fetchone()) cursor.execute('desc test_table') print(cursor.fetchone())
INSERT OVERWRITE
元のクエリ。
INSERT OVERWRITE <テーブル名> SELECT sum_a, b FROM ( SELECT SUM(a) AS sum_a, b FROM ( SELECT a, b FROM table1 UNION ALL SELECT a, b FROM table2 UNION ALL SELECT a, b FROM table3 ) t1 GROUP BY b ) t2 WHERE sum_a > {hivevar:a_param}
Presto
でINSERT OVERWRITE
は使用できません。
drop後にINSERT INTO
で作成する必要があります。
cursor = presto.connect(...).cursor() # drop cursor.execute('DROP TABLE IF EXISTS test_table') query = 'INSERT INTO test_table (sum_a, b) WITH tmp_tb AS ( SELECT SUM(a) AS sum_a, b FROM ( SELECT a, b FROM table1 UNION ALL SELECT a, b FROM table2 UNION ALL SELECT a, b FROM table3 ) GROUP BY b) SELECT sum_a, b FROM tmp_tb WHERE sum_a > %s' cursor.execute(query, (100,)) print(cursor.fetchall())