HiveクエリとBigQueryの違いで苦しんだことメモ

URL
Created
2021/3/23 3:24
Tags
最近はBigQueryでばかりクエリを書いていたので、HiveQLで書く必要性に駆られたときに、その方言の違いにだいぶ苦戦した。
なので苦労したことの備忘録。
 

テキストはシングルクォーテーションで囲む

BigQueryでは特に気にしたことはなかった。
他人のクエリをコピーした場合など、"あいうえお" と 'かきくけこ' の両方が混在することなどザラ。
(それもどうかと思うけど)
select
  id
, case
    when id = 1 then "株式会社A" -- ダブルクォーテーションでもOK
    when id = 2 then '株式会社B'
  end as company_name
SQL
これがHiveだと、シングルクォーテーションで囲む必要があるっぽい。
select
  id
, case
    when id = 1 then '株式会社A' -- シングルクォーテーションで囲む
    when id = 2 then '株式会社B' -- シングルクォーテーションで囲む
  end as company_name
SQL
 

サブクエリには命名が必要

よく集計で行うサブクエリを使った処理を書くと、こんな感じのエラーが返される。
cannot recognize input near '' '' '' in subquery source hive
調べてみると、サブクエリには命名が必須っぽい。
どういうことかというと、BigQueryの場合は以下の書き方でも一応実行できる。
SELECT
  hogehoge
, sum_hugehuge

FROM
  (
	SELECT
    hogehoge
	, sum(hugehuge) as sum_hugehuge
  )
SQL
これがHiveだと、以下のように参照するエイリアスが1つであっても命名が必須っぽい。
これを怠ると、上記のエラーが出て怒られる。
SELECT
  hogehoge
, sum_hugehuge

FROM
  (
	SELECT
    hogehoge
	, sum(hugehuge) as sum_hugehuge
  ) AS sub -- サブクエリに名前をつける
SQL
 

partitionテーブルの場合はwhere句で明記する

BigQueryの場合は、分割テーブルのフィールドを明記しなくても、全体を参照して処理することができた。
どういうことかというと、例えばYMDでpartitionが切られた以下のようなtestテーブルの場合
test
YMD
hogehoge
hugehuge
hoge1
huge1
hoge2
huge2
hoge3
huge3
以下のように特に気にせずとも、全YMDをまたいでselectすることができた
SELECT
	YMD
, hogehoge
, hugehuge

FROM
	test
SQL
これがHiveの場合は、どのpartitionでテーブルを参照するかを明記する必要があり、上記の記述だとエラーになるっぽい。
なので直すとしたら、
SELECT
	YMD
, hogehoge
, hugehuge

FROM
	test

WHERE
	YMD = "20200101"
SQL
みたいな感じだろうか。
確かに普通のカラムみたいな感じで全テーブルを参照されると、せっかく分割してる意味もない気がするので、こっちのほうが正しい使い方なのかも。
ただ一アナリストの身からすると、前者のほうが楽なシチュエーションもあるので、悩ましい。