presto/hiveクエリ変換
prestoでクエリを書いてあとでバッチ化するためにhiveに書き換えるというのはよくある話なので変換ルールをメモっておく。
prestoの方が機能的にリッチなんですが、安定性を考えるとバッチではhiveをうちの環境では使ってます。
一番よくつかうのがjson_extract_scalarをget_json_objectに変えることですね。2番目と3番目はそんなに使わないかも。
presto | hive |
---|---|
json_extract_scalar | get_json_object |
cross join unnest | lateral view explode |
mod | pmod |
ただprestoとhiveで似ているけれど微妙に挙動が違うケースがあります。
例えばprestoのurl_extract_hostとhiveのparse_url(..., 'HOST')
前者はjava.net.URIを使ってます。
https://github.com/prestodb/presto/blob/master/presto-main/src/main/java/com/facebook/presto/operator/scalar/UrlFunctions.java#L187
後者はjava.net.URLを使ってます。
https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFParseUrl.java#L70
結果としてhiveのparse_url(..., 'HOST')だとandroid-app://xxxみたいなときにxxxを取得できません。