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 文件 [重复]