来自带有AWS Glue表分区的EMR笔记本的Spark SQL错误



在部署之前,我正在EMR笔记本中测试一些pyspark代码,并使用Spark SQL不断遇到这个奇怪的错误。我已经将我所有的表和元数据与AWS Glue目录集成在一起,这样我就可以通过spark对它们进行读写。

代码的第一部分从S3/Gue中读取一些数据,进行一些转换,然后将生成的数据帧写入S3/Gue,如下所示:

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

然后,我尝试使用Spark SQL访问该表,但当我运行诸如CCD_ 1,它抛出了这个:

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);"

我了解到只有在指定日期键分区时才会发生这种情况。例如,以下两个命令都可以正常工作:CCD_ 2和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(后,它解决了。

我在类似的环境中遇到了类似的问题(EMR集群+Spark SQL+AWS Glue目录(。查询如下:

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

这是一个由";年";,以及";年;是一个字符串。注意,";年;在过滤器中使用。

我有

用户类引发异常:org.apache.spark.sql.AnalysisException:org.apache.hadoop.hive.metastore.api.InvalidObjectException:未知运算符'!='

然后我"修改的";查询到这个,它成功了!

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

我仍然想要一个直接的解决方案,但目前这个解决方案已经足够了:

我首先直接从S3路径读取表格

temp_df = spark.read.parquet(S3_PATH)

以便它不使用Glue目录作为元数据。然后我为会话创建一个临时表:

temp_df.createGlobalTempView('my_table')

这允许我使用带有global_temp数据库的Spark SQL进行查询:

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

这是

相关内容

  • 没有找到相关文章

最新更新