在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。
答案 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