Scala 从分区拼花文件读取数据帧

Scala 从分区拼花文件读取数据帧,scala,apache-spark,parquet,spark-dataframe,Scala,Apache Spark,Parquet,Spark Dataframe,如何读取条件为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到day=30是否可以读取类似(day=5到6)或day=5,day=6的内容 val dataframe = sqlContext.read.pa

如何读取条件为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到day=30
是否可以读取类似
(day=5到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
将自动添加为
数据框中的一列

编辑:从Spark 1.6开始,需要提供“basepath”选项,以便Spark自动生成列。在Spark 1.6.x中,必须像这样重新编写上述内容,以创建包含“数据”、“年”、“月”和“日”列的数据框:


您需要提供
mergeSchema=true
选项。如下所述(这是从1.6.0开始的):

这将把所有拼花地板文件读入数据框,并在数据框数据中创建年、月和日列


Ref:

如果您想多天阅读,例如
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天的所有时间都匹配。

首先感谢您的回复,我正在寻找更简单的方法。在这种情况下,大约20天作为子集,这种方式将是一种困难。我会经常过滤以检查数据的准确性。那么为什么不干脆做
val dataframe=sqlContext.read.parquet(“file:///your/path/data=jDD/year=2015/month=10/")? 
day`作为一列添加到数据框中,您可以对其进行筛选。实际上,它运行的数据非常庞大。数据是从2007年到2015年。平均有50亿行原始日志被处理和存储。我会被要求在demandRight上提供特定的数据报告,因此您要做的第一件事是执行
筛选操作。由于Spark进行惰性评估,所以数据集的大小应该不会有问题。过滤器将在任何操作之前应用,并且只有您感兴趣的数据将保存在内存中。看来唯一的答案是这样的!仅当模式不同时才需要模式合并,如果模式相同,则不需要合并。这是否仅适用于scala?我正在用pyspark进行尝试,它可以使用
{}
符号,但不能使用
[]
。我试图在一个范围内阅读。这是否适用于以相同的方式指定年和月的范围,如“file:///your/path/data=mydata/year=[2015-2018]/月=[1-6]/日=[5-10]/*”)
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]/*")