【HiveQL】pyhiveとPrestoでテーブル操作

f:id:tm200:20210704143739p:plain

beelineで実行していたクエリをpyhive + Prestoで再実装した際に書き方が違う部分があった為、備忘メモ。  


coin-look.pages.dev


 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}

PrestoINSERT OVERWRITEは使用できません。
drop後にINSERT INTOで作成する必要があります。

docs.treasuredata.com

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())