在Spark中读取ORC文件时如何保留分区列

6

在Spark中读取ORC文件时,如果您在路径中指定了分区列,则该列不会包含在数据集中。例如,如果我们有

val dfWithColumn = spark.read.orc("/some/path") 

val dfWithoutColumn = spark.read.orc("/some/path/region_partition=1")

然后 dfWithColumn 将有一个 region_partition 列,但 dfWithoutColumn 不会。我如何指定我想包括所有列,即使它们被分区了?

我正在使用 scala 上的 spark 2.2。

编辑:这是一个可重复使用的 Spark 程序,它将从命令行中获取其参数;即使用户传递表的特定分区而不是整个表,我也希望程序能够正常工作。因此,使用 Dataset.filter 不是一个选项。


如果第二行的意图只是获取该分区的数据,为什么不使用列信息过滤DF呢?由于DF是惰性评估的,谓词将被推送下去,因此读取整个文件的开销很小。 - OneCricketeer
我对问题的解释与答案不同。 - thebluephantom
3个回答

4

0

不要将您的分区列添加到路径中,而是将它们作为过滤器添加。 修改您的代码为 -

val dfWithColumn = spark.read.orc("/some/path/").where($"region_partition" === 1)

这将正确识别模式,并仅读取“region_partition = 1”目录中的数据。


看我的修改;我不想只读取特定的分区,如果用户传递了特定的分区而不是整个表,我希望我的程序仍然能够工作。 - alexgbelov

0
如果目标是加载一个分区而不是整个数据,则可以利用Spark的惰性加载并执行以下操作:
val dfWithColumn = spark.read.orc("/some/path") 
dfWithColumn= dfWithColumn.where($"region_partition" === 1)

通过这样做,您将从文件夹中获取数据:

“/some/path/region_partition=1”

这样做的好处是保留了原始结构,并在数据集中包含分区列。
但是,如果您想要操作读取的数据集以添加某些值的列,我建议使用以下方法:

withColumn


请看我的编辑;我不想只在某个分区中读取,我希望我的程序即使用户传入某个分区而不是整个表格也能正常工作。 - alexgbelov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接