阻止DataFrame.partitionBy()从架构中删除分区列



我对DataFrame进行如下分区:

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

代码给出了预期的结果(即按类型和类别划分的数据)。但是,"类型"one_answers"类别"列将从数据/架构中删除。有没有办法防止这种行为?

我能想到一种变通方法,它很蹩脚,但有效。

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

不过,我回答这个问题是希望有人能比我得到更好的答案或解释(如果OP找到了更好的解决方案),因为我也有同样的问题。

我想在这里添加更多的上下文,并为那些需要它的人提供PySpark代码而不是Scala。如果你想保留分区变量,你需要小心如何读取分区数据帧(细节很重要)。让我们从编写这样的分区数据帧开始:

df.write.mode("overwrite").partitionBy("Season").parquet("partitioned_parquet/")

要在WITH中读取整个数据帧,请使用包含的分区变量。。。

path = "partitioned_parquet/"
parquet = spark.read.parquet(path)
parquet.show()

结果:

+-----+------+
|Value|Season|
+-----+------+
|   71|  2010|
|   77|  2010|
|   83|  2010|
|   54|  2010|
|  100|  2010|
+-----+------+
only showing top 5 rows

请注意,如果在路径名的末尾包含一个*,则分区变量将被删除

path = "partitioned_parquet/*"
parquet = spark.read.parquet(path)
parquet.show(5)

结果:

+-----+
|Value|
+-----+
|   71|
|   77|
|   83|
|   54|
|  100|
+-----+
only showing top 5 rows

现在,如果您只想读取分区数据帧的部分,则需要使用此方法来保留分区变量(在本例中为"Season")。

path = "partitioned_parquet/"
dataframe = spark.read.option("basePath", path).parquet(path+'Season=2010/',
                                                                path+'Season=2011/', 
                                                                path+'Season=2012/')
dataframe.show(5)

结果:

+-----+------+
|Value|Season|
+-----+------+
|   71|  2010|
|   77|  2010|
|   83|  2010|
|   54|  2010|
|  100|  2010|
+-----+------+
only showing top 5 rows

希望这能帮助人们!

总的来说,Ivan的回答是一个很好的结论。但是。。。

如果您严格使用spark进行读写,那么在读取数据时只需使用basePath选项。

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

通过将路径/to/table传递给SparkSession.read.parquet或SparkSession_read.load,Spark SQL将自动从路径中提取分区信息。

示例:

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

相关内容

  • 没有找到相关文章

最新更新