从分区的镶木地板文件

时间:2015-11-11 12:19:43

标签: 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/*")

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天的全部数据而且数据太大了。

3 个答案:

答案 0 :(得分:52)

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/")

如果您有day=X下的文件夹,例如country=XXcountry将自动添加为dataframe中的列。

  

编辑:从Spark 1.6开始,需要提供一个" basepath" -option,以便Spark自动生成列。在Spark 1.6.x中,上面的内容必须像这样重写,以创建一个数据框,其中包含列"数据","年","月"和" 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/")

答案 1 :(得分:11)

如果您想要阅读多天,例如day = 5day = 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的所有日子。

答案 2 :(得分:5)

您需要提供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-merging