apache-spark - 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/数据
如何在文件夹名称中没有列名的情况下保存?
谢谢。
解决方案
这是预期的行为。Spark 使用 Hive 分区,因此它使用此约定进行写入,从而启用分区发现、过滤和修剪。简而言之,它通过确保读取最少的数据量来优化您的查询。
Spark 并不是真正为您需要的输出而设计的。解决此问题的最简单方法是有一个下游任务,该任务将通过在等号上拆分来简单地重命名目录。
推荐阅读
- javascript - 仅显示当前鼠标悬停 div 的子项:jQuery
- clojurescript - clojurescript 等价于重新匹配器和重新组合
- mongodb - 在解析服务器上创建文档时如何防止竞争条件?
- javascript - 如何在纯 javascript 文件中使用 fetch?
- javascript - Cytsocape.js 无法在 for 循环中创建边
- java - 如何将 HttpClient 与任何 ssl 证书一起使用,无论它有多“糟糕”
- git - Git通过清除reflog撤消所有更改?
- mainframe - 使用 SORT 从输入文件中提取数据到不提供预期数据的不同输出文件
- android - 配置变更时如何观察 WorkManager?
- python-3.x - 我如何区分 log2(2^5910-1) 和 log2(2^5910)?两者都给 5909.9999999999