如何读取条件为数据帧的分区拼花地板,
这很好,
val dataframe = sqlContext.read.parquet("file:///home/msoproj/dev_data/dev_output/aln/partitions/data=jDD/year=2015/month=10/day=25/*")
day=1 to day=30
有分区,是否可以读取类似(day = 5 to 6)
或day=5,day=6
的内容,
val dataframe = sqlContext.read.parquet("file:///home/msoproj/dev_data/dev_output/aln/partitions/data=jDD/year=2015/month=10/day=??/*")
如果我放*
,它会给我所有30天的数据,而且它太大了。
sqlContext.read.parquet
可以采用多个路径作为输入。如果你只想要day=5
和day=6
,你可以简单地添加两个路径,比如:
val dataframe = sqlContext
.read.parquet("file:///your/path/data=jDD/year=2015/month=10/day=5/",
"file:///your/path/data=jDD/year=2015/month=10/day=6/")
如果您在day=X
下有文件夹,例如country=XX
,country
将自动添加为dataframe
中的一列。
编辑:从Spark 1.6开始,需要提供一个"basepath"选项,Spark才能自动生成列。在Spark 1.6.x中,必须像这样重写以上内容,才能创建一个包含"data"、"year"、"month"one_answers"day"列的数据帧:
val dataframe = sqlContext
.read
.option("basePath", "file:///your/path/")
.parquet("file:///your/path/data=jDD/year=2015/month=10/day=5/",
"file:///your/path/data=jDD/year=2015/month=10/day=6/")
如果您想读取多天,例如day = 5
和day = 6
,并想在路径本身中提及范围,可以使用通配符:
val dataframe = sqlContext
.read
.parquet("file:///your/path/data=jDD/year=2015/month=10/day={5,6}/*")
通配符也可以用于指定天数范围:
val dataframe = sqlContext
.read
.parquet("file:///your/path/data=jDD/year=2015/month=10/day=[5-10]/*")
这是从5点到10点的所有日子。
您需要提供mergeSchema = true
选项。如下所述(这是从1.6.0开始的):
val dataframe = sqlContext.read.option("mergeSchema", "true").parquet("file:///your/path/data=jDD")
这将把所有镶木地板文件读取到数据帧中,并在数据帧数据中创建年、月和日列。
参考编号:https://spark.apache.org/docs/1.6.0/sql-programming-guide.html#schema-合并
在我使用pyspark的情况下:
sdf_table = spark.read.parquet("s3://bucket/table/**/*.parquet")
**是拼花地板的所有分区(一个glob表达式)
注意,读取桶中镶木地板的所有文件";表/",因此,请继续使用其他文件
我无法像Cristian建议的那样使用通配符。经过一番挖掘,我发现以下似乎有效:
spark.read.option("recursiveFileLookup", "true").parquet("s3a://bucket/table/")
https://kontext.tech/article/887/read-parquet-files-from-nested-directories
这个线程中的答案对我的类似需求没有帮助,所以我创建了[并随后回答了]这个问题。
在读取Synapse spark数据帧时将分区步骤作为列包含