【问题标题】:Spark partitionBy | save by column value rather than columnName={value}Spark 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)中可以看到相同的行为

标签: apache-spark apache-spark-sql


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-26
    • 2023-04-09
    • 1970-01-01
    • 2016-05-16
    • 2017-06-29
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多