Запретить DataFrame.partitionBy() удалять секционированные столбцы из схемы

Я разбиваю DataFrame следующим образом:

df.write.partitionBy("type", "category").parquet(config.outpath)

Код дает ожидаемые результаты (т.е. данные, разделенные по типу и категории). Однако столбцы "тип" и "категория" удаляются из данных/схемы. Есть ли способ предотвратить это поведение?

Ответ 1

Я могу думать об одном обходном пути, который довольно хромает, но работает.

import spark.implicits._

val duplicated = df.withColumn("_type", $"type").withColumn("_category", $"category")
duplicated.write.partitionBy("_type", "_category").parquet(config.outpath)

Я отвечаю на этот вопрос в надежде, что у кого-то будет лучший ответ или объяснение, чем у меня (если OP найдет лучшее решение), хотя, поскольку у меня есть тот же вопрос.

Ответ 2

В общем, ответ Ивана - это прекрасное чувство. НО...

Если вы строго читаете и записываете в искру, вы можете просто использовать опцию basePath при чтении ваших данных.

https://spark.apache.org/docs/2.2.0/sql-programming-guide.html#partition-discovery

Путем передачи пути/в таблицу /SparkSession.read.parquet или SparkSession.read.load, Spark SQL будет автоматически извлекать информацию о секционировании из путей.

Пример:

     val dataset = spark
      .read
      .format("parquet")
      .option("basePath", hdfsInputBasePath)
      .load(hdfsInputPath)