Spark partitionBy |按列值而不是 columnName=value 保存

Posted

技术标签:

【中文标题】Spark partitionBy |按列值而不是 columnName=value 保存【英文标题】:Spark partitionBy | save by column value rather than columnName=valueSpark partitionBy |按列值而不是 columnName=value 保存 【发布时间】:2019-11-24 16:49:48 【问题描述】:

我使用的是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/数据

我正在使用以下代码 sn-p

  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/数据

如果文件夹名称中没有列名,如何保存?

谢谢。

【问题讨论】:

我希望您尝试在 HDFS 上存储。对吗? 嗯,我正在使用 Google 存储服务来保存生产中的文件。在开发机器文件系统(Mac)中可以看到相同的行为 【参考方案1】:

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

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

【讨论】:

以上是关于Spark partitionBy |按列值而不是 columnName=value 保存的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中使用 partitionBy 保存 CSV 文件 [重复]

如何在 partitionBy 输出之前平衡 Spark DataFrame 数据

Laravel减少列值而不是负值

按列值分组的列值更新mysql排名

Spark Scala聚合函数,用于查找组中列值的出现次数

在MySQL中按列值进行SUM