Hive 筛选spark分区表在Pyspark中不起作用

Hive 筛选spark分区表在Pyspark中不起作用,hive,pyspark,partitioning,Hive,Pyspark,Partitioning,我正在使用spark 2.3,并且已经编写了一个dataframe来使用pyspark中的dataframe编写器类方法创建配置单元分区表 newdf.coalesce(1).write.format('orc').partitionBy('veh_country').mode("overwrite").saveAsTable('emp.partition_Load_table') 这是我的表结构和分区信息 hive> desc emp.partition_Load_table; OK

我正在使用spark 2.3,并且已经编写了一个dataframe来使用pyspark中的dataframe编写器类方法创建配置单元分区表

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()

我的问题是为什么它首先不能过滤数据帧。还有为什么它会抛出一条错误消息“过滤只支持string类型的分区键”,尽管我的veh_country被定义为string或varchar数据类型。

我也偶然发现了这个问题。对我有帮助的是这样做:

spark.sql("SET spark.sql.hive.manageFilesourcePartitions=False")
然后使用
spark.sql(查询)
而不是使用dataframe

    df2_data = spark.sql("""
    SELECT * 
    from udb.partition_Load_table
    """);

df2_data.show() --> is working
我不知道引擎盖下发生了什么,但这解决了我的问题


虽然这对你来说可能太晚了(因为这个问题是在8个月前提出的),但这可能会对其他人有所帮助。

谢谢。:-)我会检查并让你知道,谢谢你的努力,事实上,即使我关闭了这个属性,我也会进一步重现这个问题。我不知道当时发生的原因,也不知道它是如何修复的。谢谢你的时间。我对你的努力投赞成票,但我不能接受你的回答。看起来此属性与此问题有关。尽管这个问题已经不再出现了。