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を取得できません。

しょうがないのでjava.net.URIを使うようにしたhive udfを作成してそれを使うようにしました。