问题
是否有任何方法在不同的分区中存储不同(不兼容)模式的数据?
问题
我使用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失败了。
代码
# 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()
发布于 2020-04-16 20:18:49
只是在这种情况下,它可能对某人有用。在不同的分区中有不同的数据是可能的。要使火花不推断地板的模式-指定模式:
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()
https://stackoverflow.com/questions/61227508
复制相似问题