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 列同时具有 searchFiredSearchFired 作为值。但是,如果我从数据框中删除其中一个,那么我就可以成功写入。我该如何解决这个问题?

【问题讨论】:

【参考方案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 partitionBy

spark中partitionBy和groupBy有啥区别

Spark中repartition和partitionBy的区别

为啥在 Spark 中重新分区比 partitionBy 快?

Spark Cassandra 使用区分大小写的名称写入 UDT 失败

如何在窗口 scala/spark 中使用 partitionBy 函数