簡體   English   中英

帶有 AWS Glue 表分區的 EMR Notebook 出現 Spark SQL 錯誤

[英]Spark SQL error from EMR notebook with AWS Glue table partition

在部署 EMR 筆記本之前,我正在測試一些 pyspark 代碼,並繼續使用 Spark SQL 遇到這個奇怪的錯誤。我將所有表和元數據與 AWS Glue 目錄集成,以便我可以通過 spark 讀取和寫入它們.

代碼的第一部分從 S3/Glue 讀取一些數據,進行一些轉換等等,然后將結果 dataframe 寫入 S3/Glue,如下所示:

df.repartition('datekey','coeff')\
    .write\
    .format('parquet')\
    .partitionBy('datekey','coeff')\
    .mode('overwrite')\
    .option("path", S3_PATH)\
    .saveAsTable('hive_tables.my_table')

然后我嘗試使用 Spark SQL 訪問這個表,但是當我運行像spark.sql('select * from hive_tables.my_table where datekey=20210506').show()這樣簡單的東西時,它會拋出這個:

An error was encountered:
"org.apache.hadoop.hive.metastore.api.InvalidObjectException: Unknown type : 'double' (Service: AWSGlue; Status Code: 400; Error Code: InvalidInputException; Request ID: 43ff3707-a44f-41be-b14a-7b9906d8d8f9; Proxy: null);"
Traceback (most recent call last):
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/readwriter.py", line 778, in saveAsTable
    self._jwrite.saveAsTable(name)
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
    answer, self.gateway_client, self.target_id, self.name)
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: "org.apache.hadoop.hive.metastore.api.InvalidObjectException: Unknown type : 'double' (Service: AWSGlue; Status Code: 400; Error Code: InvalidInputException; Request ID: 43ff3707-a44f-41be-b14a-7b9906d8d8f9; Proxy: null);"

我了解到只有在指定 datekey 分區時才會發生這種情況。 例如,以下兩個命令都可以正常工作: spark.sql('select * from hive_tables.my_table where coeff=0.5').show()spark.sql('select * from hive_tables.my_table').show()

我已經通過 Spark SQL 驗證分區存在並且其中有數據。 datekey查詢也可以通過 AWS Athena 正常工作——只是不是 Spark SQL。

Glue 也肯定識別出兩個分區列:

datekey: int
coeff: double

這里有什么想法嗎? 我已經嘗試了我能想到的一切,但它沒有任何意義。

我在 emr 6.3.0 (Spark 3.1.1) 中有同樣的錯誤。

升級到 emr 6.5.0 (Spark 3.1.2) 后,解決了。

我仍然想要一個直接的解決方案,但目前這種解決方法就足夠了:

我首先直接從 S3 路徑讀取表格

temp_df = spark.read.parquet(S3_PATH)

這樣它就不會使用 Glue 目錄作為元數據。 然后我為 session 創建一個臨時表:

temp_df.createGlobalTempView('my_table')

這允許我使用帶有global_temp數據庫的 Spark SQL 來查詢它:

spark.sql('select * from global_temp.my_table where datekey=20210506').show()

這有效

我在類似的環境(EMR 集群 + Spark SQL + AWS Glue 目錄)中遇到了類似的問題。 查詢是這樣的:

select * 
from ufd.core_agg_data
where year <> date_format(current_timestamp, 'yyyy')

這是一個按“年”分區的表,“年”是一個字符串。 請注意,過濾器中使用了“年”。

我有

用戶 class 拋出異常:org.apache.spark.sql.AnalysisException:org.apache.hadoop.hive.metastore.882902841known operator5988:UnvalidObject!

然后我將查詢“修改”為這個查詢,它成功了!

select * 
from ufd.core_agg_data
where year in (select date_format(current_timestamp, 'yyyy'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM