首页 > 解决方案 > Spark partitionBy | 按列值而不是 columnName={value} 保存

问题描述

我正在使用 scala 和 spark,我的 spark 版本是 2.4.3

我的数据框看起来像这样,还有其他列我没有放置并且不相关。

+-----------+---------+---------+
|ts_utc_yyyy|ts_utc_MM|ts_utc_dd|
+-----------+---------+---------+
|2019       |01       |20       |
|2019       |01       |13       |
|2019       |01       |12       |
|2019       |01       |19       |
|2019       |01       |19       |
+-----------+---------+---------+

基本上我想以分桶格式存储数据,例如

2019/01/12/数据

2019/01/13/数据

2019/01/19/数据

2019/01/20/数据

我正在使用以下代码片段

  df.write
  .partitionBy("ts_utc_yyyy","ts_utc_MM","ts_utc_dd")
    .format("csv")
    .save(outputPath)

但问题是它与下面的列名一起存储。

ts_utc_yyyy=2019/ts_utc_MM=01/ts_utc_dd=12/数据

ts_utc_yyyy=2019/ts_utc_MM=01/ts_utc_dd=13/数据

ts_utc_yyyy=2019/ts_utc_MM=01/ts_utc_dd=19/数据

ts_utc_yyyy=2019/ts_utc_MM=01/ts_utc_dd=20/数据

如何在文件夹名称中没有列名的情况下保存?

谢谢。

标签: apache-sparkapache-spark-sql

解决方案


这是预期的行为。Spark 使用 Hive 分区,因此它使用此约定进行写入,从而启用分区发现、过滤和修剪。简而言之,它通过确保读取最少的数据量来优化您的查询。

Spark 并不是真正为您需要的输出而设计的。解决此问题的最简单方法是有一个下游任务,该任务将通过在等号上拆分来简单地重命名目录。


推荐阅读