spark:区分大小写的partitionBy列

时间:2016-07-26 18:30:18

标签: apache-spark hive apache-spark-sql spark-dataframe

我正在尝试使用分区键在hiveContext(for 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 个答案:

答案 0 :(得分:0)

依赖文件系统中的案例差异通常不是一个好主意。

解决方案是使用类似的东西(使用Scala DSL)将不同情况下的值组合到同一个分区中:

df
  .withColumn("par_event_type", expr("lower(event_type)"))
  .write
  .partitionBy("par_event_type")
  .mode(SaveMode.Overwrite)
  .orc("/path")

这会为分区添加额外的列。如果这会导致问题,您可以在阅读数据时使用drop将其删除。