spark:区分大小写的 partitionBy 列
Posted
技术标签:
【中文标题】spark:区分大小写的 partitionBy 列【英文标题】:spark: case sensitive partitionBy column 【发布时间】:2016-07-26 18:30:17 【问题描述】:我正在尝试使用分区键在 hiveContext(用于 orc 格式)中写出数据帧:
df.write().partitionBy("event_type").mode(SaveMode.Overwrite).orc("/path");
但是,我尝试分区的列具有区分大小写的值,这会在写入时引发错误:
Caused by: java.io.IOException: File already exists: file:/path/_temporary/0/_temporary/attempt_201607262359_0001_m_000000_0/event_type=searchFired/part-r-00000-57167cfc-a9db-41c6-91d8-708c4f7c572c.orc
event_type
列同时具有 searchFired
和 SearchFired
作为值。但是,如果我从数据框中删除其中一个,那么我就可以成功写入。我该如何解决这个问题?
【问题讨论】:
【参考方案1】:依赖文件系统中的大小写差异通常不是一个好主意。
解决方案是使用类似(使用 Scala DSL)将大小写不同的值组合到同一个分区中:
df
.withColumn("par_event_type", expr("lower(event_type)"))
.write
.partitionBy("par_event_type")
.mode(SaveMode.Overwrite)
.orc("/path")
这为分区添加了一个额外的列。如果这导致问题,您可以在读取数据时使用drop
将其删除。
【讨论】:
以上是关于spark:区分大小写的 partitionBy 列的主要内容,如果未能解决你的问题,请参考以下文章
Spark中repartition和partitionBy的区别
为啥在 Spark 中重新分区比 partitionBy 快?