EMRのSparkやHiveでサブクエリが使えるか試してみたメモ。
メタデータカタログはGlueデータカタログを使用。GlueのVPCエンドポイントを使ったところ、インターネットに出ずにデータカタログが参照できたのが意外だった。そちらの話はまた別途メモ予定。
確認環境
[hadoop@ip-192-168-2-187 ~]$ spark-sql --version Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_\ version 2.4.5-amzn-0 /_/ [hadoop@ip-192-168-2-187 ~]$ hive --version Hive 2.3.6-amzn-2
元ネタ
spark-sql> select * from fruit_order; |order_date|fruit_name|order_quantity| |2020-02-03| バナナ| 7| |2020-02-01| ぶどう| 2| |2020-02-01| ぶどう| 3| |2020-02-01| りんご| 5| |2020-02-02| りんご| 1| |2020-02-02| りんご| 3| |2020-02-02| ぶどう| 4| |2020-02-02| みかん| 2|
spark-submit -> いけた
# スクリプト test.py from pyspark.sql import SparkSession spark = SparkSession \ .builder \ .enableHiveSupport() \ .getOrCreate() df = spark.sql("SELECT * FROM testdb.fruit_order") df.show() df2 = spark.sql("SELECT * FROM testdb.fruit_order where order_quantity = (select max(order_quantity) from testdb.fruit_order)") df2.show()
実行結果
[hadoop@ip-192-168-2-187 ~]$ spark-submit test.py ~~~~~~ +----------+-------------+--------------+ |order_date|category_name|order_quantity| +----------+-------------+--------------+ |2020-02-03| バナナ| 7| |2020-02-01| ぶどう| 2| |2020-02-01| ぶどう| 3| |2020-02-01| りんご| 5| |2020-02-02| りんご| 1| |2020-02-02| りんご| 3| |2020-02-02| ぶどう| 4| |2020-02-02| みかん| 2| +----------+-------------+--------------+ ~~~~~ +----------+-------------+--------------+ |order_date|category_name|order_quantity| +----------+-------------+--------------+ |2020-02-03| バナナ| 7| +----------+-------------+--------------+
spark-sql -> いけた
spark-sql> select * from fruit_order where order_quantity = (select max(order_quantity) from fruit_order); |order-date|fruit_name|order-quantity| |2020-02-03| バナナ| 7|
hive -> いけなかった
hive> select * from fruit_order; OK |fruit_order.order_date |fruit_order.category_name|fruit_order.order_quantity| |2020-02-03 |バナナ | 7| |2020-02-01 |ぶどう | 2| |2020-02-01 |ぶどう | 3| |2020-02-01 |りんご | 5| |2020-02-02 |りんご | 1| |2020-02-02 |りんご | 3| |2020-02-02 |ぶどう | 4| |2020-02-02 |みかん | 2| Time taken: 2.043 seconds, Fetched: 8 row(s) hive> select * from fruit_order where order_quantity = (select max(order_quantity) from fruit_order); FAILED: SemanticException Line 0:-1 Unsupported SubQuery Expression 'order_quantity': Only SubQuery expressions that are top level conjuncts are allowed
どっちもいけるかと思いきや、hiveの方がいけないのが意外だった。うまくいくSQLもあると思われるのでまた調査かな。