Как сохранить ключ раздела в файле с помощью Spark - PullRequest
0 голосов
/ 02 апреля 2020

Я использую 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 также был частью содержимого файлов - это возможно? и если это - как?

Спасибо!

1 Ответ

0 голосов
/ 02 апреля 2020

По умолчанию это невозможно, но есть некоторые обходные пути для этого случая.

  • Добавляя новое поле с именем 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.

...