java - 如何使用 Spark 将分区键保存在文件中
问题描述
我正在使用 java 8 创建我的第一个 Spark 作业。
我有JavaRDD<Row>
以下架构:
List<StructField> fields = Arrays.asList(
DataTypes.createStructField("lastName", DataTypes.StringType, false),
DataTypes.createStructField("firstName", DataTypes.StringType, false),
DataTypes.createStructField("age", DataTypes.LongType, false),
DataTypes.createStructField("gender", DataTypes.StringType, false));
我想将这些数据保存到按lastName
列分组的文件中 - 所以我这样做了:
dff
.repartition(1)
.write()
.mode (SaveMode.Overwrite)
.partitionBy("lastName")
.format("com.databricks.spark.csv")
.option("delimiter", "\t")
.option("encoding", "UTF-8")
.option("header", "true")
.csv(cmd.getOptionValue("dir"));
我有几个目录 ( lastName=*something*
),每个目录都包含一个以 part-X 开头的文件。
但是 - 我希望该lastName
列也成为文件内容的一部分 - 这可能吗?如果是 - 怎么样?
谢谢!
解决方案
默认情况下这是不可能的但是对于这种情况有一些解决方法。
- 通过添加名为的新字段并从列中
LastName
填充相同的数据。lastName
Example:
val df=Seq(("1","a"),("2","b")).toDF("LastName","lastname")
//allow casesensitive
spark.conf.set("spark.sql.caseSensitive", "true")
//here we are partition by lastname and file will have LastName data
df.write.mode("overwrite").partitionBy("lastname").save("<path>")
//read from the from
spark.read.parquet("<path>").show()
//+--------+--------+
//|LastName|lastname|
//+--------+--------+
//| 2| b|
//| 1| a|
//+--------+--------+
其他方式是您可以添加new column
(不是姓氏)并lastName
在从 csv 文件读取数据后填充数据,将新列重命名为lastName
.
推荐阅读
- rust - 如何将许多参数传递给 rust actix_web 路由
- flutter - 深入查询firestore 2子集合
- hololens - 是否可以将我的台式电脑的网络摄像头与 hololens 2 模拟器一起使用?
- html - 评论框,让评论自动填充左边空白
- python - python - 在值的查询集中更改字典键
- python - Python 将每月和分钟数据帧与 TZ 感知的日期时间索引相结合
- javascript - Using method during copying object by spread operator in map method
- css - Vaadin 14 - 在文件上传时显示错误,就像在任何其他输入字段中一样
- json - 在循环中使用 jq 更新 json(数组元素)中的值
- python - 使用 bs4 和 selenium 获取错误类的元素