Apache spark 在Spark中读取ORC文件时如何保持分区列

Apache spark 在Spark中读取ORC文件时如何保持分区列,apache-spark,apache-spark-sql,orc,Apache Spark,Apache Spark Sql,Orc,在Spark中读取ORC文件时,如果在路径中指定分区列,则该列将不包括在数据集中。例如,如果我们有 val dfWithColumn = spark.read.orc("/some/path") val dfWithoutColumn = spark.read.orc("/some/path/region_partition=1") 然后dfWithColumn将有一个region\u分区列,但dfWithoutColumn不会。如何指定要包含所有列,即使它们已分区 我在scala上使用s

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

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

val dfWithoutColumn = spark.read.orc("/some/path/region_partition=1")
然后dfWithColumn将有一个region\u分区列,但dfWithoutColumn不会。如何指定要包含所有列,即使它们已分区

我在scala上使用spark 2.2


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

与其在路径中添加分区列,不如将它们添加为筛选器。将代码修改为-

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

这将正确识别模式,并且只读取“region\u partition=1”目录的数据。

如果目的是加载一个分区而不是整个数据,那么您可以从spark的延迟加载中获益,并执行以下操作:

val dfWithColumn = spark.read.orc("/some/path") 
dfWithColumn= dfWithColumn.where($"region_partition" === 1)
通过执行此操作,您将从文件夹中获取数据:

“/some/path/region\u partition=1”

这样做的好处是在数据集中保留了分区列的原始结构

但是,如果您打算操纵读取数据集以添加具有某些值的列,我建议使用以下方法:

带柱


它和拼花地板一样

参考:


df有一个“partition\u column”列。

如果第二行的目的是只获取该分区的数据,为什么不使用列信息过滤df?由于DFs是延迟计算的,谓词将被向下推,并且没有读取整个文件的开销。我对问题的解释与tgecanswersSee my edit不同;我不想只读取某个分区,我希望即使用户传入某个分区而不是整个表,我的程序也能正常工作;我不想只读取某个分区,我希望即使用户传入某个分区而不是整个表,我的程序也能正常工作。
df = spark.read.option("basePath", "file://foo/bar/")
         .orc("file://foo/bar/partition_column=XXX")