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

时间:2018-09-12 20:23:58

标签: 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_partition列,但dfWithoutColumn将没有。我该如何指定我要包括所有列,即使它们已分区?

我正在Scala上使用spark 2.2。

EDIT:这是一个可重复使用的Spark程序,将从命令行获取其参数;我希望程序即使用户传递表的特定分区而不是整个表也能运行。因此,不能使用Dataset.filter。

3 个答案:

答案 0 :(得分:1)

与镶木地板相同。

参考:https://spark.apache.org/docs/latest/sql-data-sources-parquet.html#partition-discovery

df = spark.read.option("basePath", "file://foo/bar/")
         .orc("file://foo/bar/partition_column=XXX")

df有一个“ partition_column”列。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

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

  

“ / some / path / region_partition = 1”

这样做的好处是,您可以在数据集中使用分区列来保留原始结构。

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

  

withColumn