管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

EMRのSparkやHiveでサブクエリが使えるか試してみた

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もあると思われるのでまた調査かな。

参考URL