Запретить 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)