我正在使用spark 2.3,并使用pyspark中的dataframe writer类方法编写了一个数据框来创建配置单元分区表。
newdf.coalesce(1).write.format('orc').partitionBy('veh_country').mode("overwrite").saveAsTable('emp.partition_Load_table')
这是我的表结构和分区信息。
hive> desc emp.partition_Load_table;
OK
veh_code varchar(17)
veh_flag varchar(1)
veh_model smallint
veh_country varchar(3)
# Partition Information
# col_name data_type comment
veh_country varchar(3)
hive> show partitions partition_Load_table;
OK
veh_country=CHN
veh_country=USA
veh_country=RUS
现在,我正在数据框内的pyspark中读取此表。
df2_data = spark.sql("""
SELECT *
from udb.partition_Load_table
""");
df2_data.show() --> is working
但是我无法使用分区键列对其进行过滤
from pyspark.sql.functions import col
newdf = df2_data.where(col("veh_country")=='CHN')
我收到以下错误消息:
: java.lang.RuntimeException: Caught Hive MetaException attempting to get partition metadata by filter from Hive.
You can set the Spark configuration setting spark.sql.hive.manageFilesourcePartitions to false to work around this problem,
however this will result in degraded performance. Please report a bug: https://issues.apache.org/jira/browse/SPARK
Caused by: MetaException(message:Filtering is supported only on partition keys of type string)
而当我通过指定表的hdfs绝对路径创建数据帧时。过滤器和where子句按预期工作。
newdataframe = spark.read.format("orc").option("header","false").load("hdfs/path/emp.db/partition_load_table")
下面的工作
newdataframe.where(col("veh_country")=='CHN').show()
我的问题是,为什么它不能首先过滤数据帧。以及为什么它会抛出错误消息“即使我的veh_country被定义为字符串或varchar数据类型,也仅支持字符串类型的分区键进行过滤”。
答案 0 :(得分:2)
我也偶然发现了这个问题。对我帮助的是执行以下操作:
spark.sql("SET spark.sql.hive.manageFilesourcePartitions=False")
,然后使用spark.sql(query)
而不是使用数据框。
我不知道幕后会发生什么,但这解决了我的问题。
尽管对您来说可能为时已晚(因为这个问题是8个月前提出的),但这可能对其他人有所帮助。