scala - Spark 1.6:将数据帧存储到 hdfs 中的多个 csv 文件中(按 id 分区)
问题描述
我正在尝试通过 id 将 dataFrame 保存到 csv 分区中,因为我使用的是 spark 1.6 和 scala。函数 partitionBy("id") 没有给我正确的结果。
我的代码在这里:
validDf.write
.partitionBy("id")
.format("com.databricks.spark.csv")
.option("header", "true")
.option("delimiter", ";")
.mode("overwrite")
.save("path_hdfs_csv")
My Dataframe looks like :
-----------------------------------------
| ID | NAME | STATUS |
-----------------------------------------
| 1 | N1 | S1 |
| 2 | N2 | S2 |
| 3 | N3 | S1 |
| 4 | N4 | S3 |
| 5 | N5 | S2 |
-----------------------------------------
此代码不基于列 ID 创建 3 个 csv 默认分区(part_0、part_1、part_2)。
我期望的是:为每个 id 获取子目录或分区。有什么帮助吗?
解决方案
spark1.6(或所有低于 2 的 spark 版本)中的 Spark-csv 不支持分区。
您的代码适用于 spark > 2.0.0。
对于您的 spark 版本,您需要先准备 csv 并将其保存为文本(分区适用于spark-text
):
import org.apache.spark.sql.functions.{col,concat_ws}
val key = col("ID")
val concat_col = concat_ws(",",df.columns.map(c=>col(c)):_*) // concat cols to one col
val final_df = df.select(col("ID"),concat_col) // dataframe with 2 columns: id and string
final_df.write.partitionBy("ID").text("path_hdfs_csv") //save to hdfs
推荐阅读
- python-3.x - 使用 psycopg2 在表中插入值
- java - JavaFX 按钮 minWidth 被忽略
- php - 如何在没有打印对话框窗口的情况下自动打印数据内容(在 Div、表格、表单等上)-(WebClientPrint-Neodynamic)
- android - 在 SMS 上截断 DynamicLink url
- cassandra - Nodetool 加载和拥有的统计信息
- javascript - Highcharts:如果先前的数组只有空值,则系列不会更新
- mysql - 错误代码:1290。MySQL 服务器正在使用 --secure-file-priv 选项运行
- list - Flutter 应用中的无限列表
- xpages - 如何从 XPage 的 radiogroup 中的 sessionscope 中获取价值
- php - 使用 .htaccess/functions.php 更改搜索网址