首页 > 解决方案 > 如何使用 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列也成为文件内容的一部分 - 这可能吗?如果是 - 怎么样?

谢谢!

标签: javaapache-sparkapache-spark-sqlpartitioning

解决方案


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

  • 通过添加名为的新字段并从列中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.


推荐阅读