gpt4 book ai didi

java - 如何使用 Spark 将分区键保存在文件中

转载 作者:行者123 更新时间:2023-12-01 17:39:01 25 4
gpt4 key购买 nike

我正在使用 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* ),每个目录都包含一个以 X 部分开头的文件。

但是 - 我想要 lastName列也成为文件内容的一部分 - 这可能吗?如果是的话 - 怎么办?

谢谢!

最佳答案

默认情况下这是不可能的,但对于这种情况有一些解决方法。

  • 添加名为 LastName 的新字段,并从 lastName 列填充相同的数据。

示例:

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|
//+--------+--------+

另一种方法是您可以添加新列(姓氏以外的其他内容)并从lastName填充数据,然后在从csv文件读取数据后将新列重命名为姓氏

关于java - 如何使用 Spark 将分区键保存在文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60994751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com