首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >火花动态分区:读取时的SchemaColumnConvertNotSupportedException

火花动态分区:读取时的SchemaColumnConvertNotSupportedException
EN

Stack Overflow用户
提问于 2020-04-15 11:25:04
回答 1查看 184关注 0票数 0

问题

是否有任何方法在不同的分区中存储不同(不兼容)模式的数据?

问题

我使用PySpark v2.4.5、拼花格式和动态分区,并采用以下层次结构:BASE_PATH/COUNTRY=US/TYPE=sms/YEAR=2020/MONTH=04/DAY=10/。不幸的是,它是无法改变的。

我让SchemaColumnConvertNotSupportedException读了。这是因为不同类型(即sms和mms之间)的架构不同。看起来像星火试图合并到模式读取下的遮罩下。

更准确地说,我可以读取F.col('TYPE') == 'sms'的数据,因为mms模式可以转换为sms。但是当我用F.col('TYPE') == 'mms'进行过滤时,Spark失败了。

代码

代码语言:javascript
运行
复制
# Works, because Spark doesn't try to merge schemas
spark_session \
   .read \
   .option('mergeSchema', False) \
   .parquet(BASE_PATH + '/COUNTRY_CODE=US/TYPE=mms/YEAR=2020/MONTH=04/DAY=07/HOUR=00') \
   .show()

# Doesn't work, because Spark trying to merge schemas for TYPE=sms and TYPE=mms. Mms data can't be converted to merged schema.
# Types are correct, from explain Spark treat date partitions as integers
# Predicate pushdown isn't used for some reason, there is no PushedFilter in explained plan
spark_session \
   .read \
   .option('mergeSchema', False) \
   .parquet(BASE_PATH) \
   .filter(F.col('COUNTRY') == 'US') \
   .filter(F.col('TYPE') == 'mms') \
   .filter(F.col('YEAR') == 2020) \
   .filter(F.col('MONTH') == 4) \
   .filter(F.col('DAY') == 10) \
   .show()
EN

回答 1

Stack Overflow用户

发布于 2020-04-16 20:18:49

只是在这种情况下,它可能对某人有用。在不同的分区中有不同的数据是可能的。要使火花不推断地板的模式-指定模式:

代码语言:javascript
运行
复制
spark_session \
   .read \
   .schema(some_schema) \
   .option('mergeSchema', False) \
   .parquet(BASE_PATH) \
   .filter(F.col('COUNTRY') == 'US') \
   .filter(F.col('TYPE') == 'mms') \
   .filter(F.col('YEAR') == 2020) \
   .filter(F.col('MONTH') == 4) \
   .filter(F.col('DAY') == 10) \
   .show()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61227508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档