如何在spark Scala中读取s3中的多个目录?

时间:2018-03-08 08:49:18

标签: apache-spark apache-spark-sql

我在s3中有以下格式的目录,

 <base-directory>/users/users=20180303/hour=0/<parquet files>
 <base-directory>/users/users=20180303/hour=1/<parquet files>
 ....
 <base-directory>/users/users=20180302/hour=<0 to 23>/<parquet files>
 <base-directory>/users/users=20180301/hour=<0 to 23>/<parquet files>
 ....
 <base-directory>/users/users=20180228/hour=<0 to 23>/<parquet files>

基本上我在每日目录中都有每小时的子目录。

现在我想在过去30天内处理镶木地板文件。

我试过了,

 val df = sqlContext.read.option("header", "true")
    .parquet(<base-directory> + File.separator + "users" + File.separator)
    .where(col("users").between(startDate, endDate))

其中endDate和startDate以yyyymmdd格式分隔30天。

上述解决方案未提供正确的目录子集。我做错了什么?

1 个答案:

答案 0 :(得分:0)

where函数用于dataframe中的过滤行。您正在使用它来读取 s3 中的parquet个文件。 所以整个概念都错了

相反,您可以在startDate和endDate 之间创建一个路径数组,并将其传递给 sqlContext read api

以编程方式发言,您可以执行以下操作(它们只是伪代码)

val listBuffer = new ListBuffer[String]
for(date <- startDate to endDate)
  listBuffer.append(<base-directory> + File.separator + "users" + File.separator+"users="+date)

val df = sqlContext.read.option("header", "true").parquet(listBuffer: _*)