hive - 过滤火花分区表在 Pyspark 中不起作用
问题描述
我正在使用 spark 2.3 并使用 pyspark 中的数据帧编写器类方法编写了一个数据帧来创建配置单元分区表。
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绝对路径来创建数据框时。filter 和 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 数据类型。
解决方案
我也偶然发现了这个问题。对我有帮助的是这样做:
spark.sql("SET spark.sql.hive.manageFilesourcePartitions=False")
然后使用spark.sql(query)
而不是使用数据框。
我不知道幕后发生了什么,但这解决了我的问题。
尽管对您来说可能为时已晚(因为这个问题是 8 个月前提出的),但这可能对其他人有所帮助。
推荐阅读
- java - 修改标准 JAX-WS 应用程序客户端以使其接受 text/plain 作为 text/xml
- javascript - 为什么 getElementById 方法适用于单个变量而不适用于两个串联变量?
- javascript - 在 React 中过滤数据以精确匹配
- python - 有没有办法以 Google Calendar API 在 Python 中想要的格式获取当前时区?
- c - 如果双向链表是奇数,则删除中间和最后一个节点
- reactjs - 反应惰性加载器需要太长时间才能渲染
- node.js - 从节点包扩展类型
- android - 从布局中获取位图会使布局不完整
- javascript - 为什么当我在javascript中动态添加新元素时禁用滚动
- pixi.js - pixjs:显示和隐藏包含所有元素的容器