从分区的镶木地板文件中读取DataFrame

Woo*_*per 22 scala apache-spark parquet spark-dataframe

如何读取条件为数据帧的分区镶木地板,

这工作正常,

val dataframe = sqlContext.read.parquet("file:///home/msoproj/dev_data/dev_output/aln/partitions/data=jDD/year=2015/month=10/day=25/*")
Run Code Online (Sandbox Code Playgroud)

分区是有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=??/*")
Run Code Online (Sandbox Code Playgroud)

如果我把*它给我所有30天的数据,它太大了.

Gle*_*olt 59

sqlContext.read.parquet可以采用多个路径作为输入.如果你只想day=5day=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/")
Run Code Online (Sandbox Code Playgroud)

如果你有文件夹day=X,比如说country=XX,country将自动添加为一个列dataframe.

编辑:从Spark 1.6开始,需要提供"basepath"选项,以便Spark自动生成列.在Spark 1.6.x中,必须像这样重写上面的内容,以创建一个包含"data","year","month"和"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/")
Run Code Online (Sandbox Code Playgroud)

  • 是的,所以你要做的第一件事就是`过滤器'操作.由于Spark进行了懒惰评估,因此您应该对数据集的大小没有任何问题.过滤器将在任何操作之前应用,只有您感兴趣的数据将保留在内存中. (4认同)
  • 那么为什么不简单地做`val dataframe = sqlContext.read.parquet("file:///your/path/data=jDD/year=2015/month=10/")?`day` 作为列添加到数据框中,然后您可以对其进行过滤。 (2认同)

Nee*_*che 17

如果你想读多天,例如day = 5day = 6,想提路径本身的范围内,可以使用通配符:

val dataframe = sqlContext
  .read
  .parquet("file:///your/path/data=jDD/year=2015/month=10/day={5,6}/*")
Run Code Online (Sandbox Code Playgroud)

通配符还可用于指定一系列天数:

val dataframe = sqlContext
  .read
  .parquet("file:///your/path/data=jDD/year=2015/month=10/day=[5-10]/*")
Run Code Online (Sandbox Code Playgroud)

这匹配从5到10的所有日子.

  • 这是scala专用的吗?我正在使用 pyspark 进行尝试,它适用于“{}”符号,但不适用于“[]”。我正在尝试在一定范围内阅读。 (4认同)

小智 6

你需要提供mergeSchema = true选择.如下所述(这是1.6.0):

val dataframe = sqlContext.read.option("mergeSchema", "true").parquet("file:///your/path/data=jDD")
Run Code Online (Sandbox Code Playgroud)

这会将所有镶木地板文件读入数据框,并在数据框数据中创建年,月,日列.

参考:https://spark.apache.org/docs/1.6.0/sql-programming-guide.html#schema-merging

  • 仅当架构不同时才需要架构合并,如果它们相同,则您不需要它。 (5认同)