如何在Spark Scala中读取多个实木复合地板文件

时间:2019-10-04 17:39:02

标签: scala list apache-spark apache-spark-sql parquet

下面是一些文件夹,这些文件夹可能会随时更新。他们有多个.parquet文件。如何在Scala的Spark数据框中读取它们?

  • “ id = 200393 / date = 2019-03-25”
  • “ id = 200393 / date = 2019-03-26”
  • “ id = 200393 / date = 2019-03-27”
  • “ id = 200393 / date = 2019-03-28”
  • “ id = 200393 / date = 2019-03-29”,依此类推...

注意:-可能有100个日期文件夹,我只需要选择特定的文件夹(例如25,26和28)

有没有比下面更好的方法了?

import org.apache.spark._
import org.apache.spark.SparkContext._
import org.apache.spark.sql._

val spark = SparkSession.builder.appName("ScalaCodeTest").master("yarn").getOrCreate()
val parquetFiles = List("id=200393/date=2019-03-25", "id=200393/date=2019-03-26", "id=200393/date=2019-03-28")

spark.read.format("parquet").load(parquetFiles: _*)

上面的代码正在工作,但是我想做下面的事情-

val parquetFiles = List()
parquetFiles(0) = "id=200393/date=2019-03-25"
parquetFiles(1) = "id=200393/date=2019-03-26"
parquetFiles(2) = "id=200393/date=2019-03-28"
spark.read.format("parquet").load(parquetFiles: _*)

2 个答案:

答案 0 :(得分:0)

您可以通过这种方式读取它,以读取目录id = 200393中的所有文件夹:

val df  = spark.read.parquet("id=200393/*")

如果您只想选择某些日期,例如仅选择2019年9月:

val df  = spark.read.parquet("id=200393/2019-09-*")

如果您有特殊的日子,可以在列表中包含天数列表

  val days = List("2019-09-02", "2019-09-03")
  val paths = days.map(day => "id=200393/" ++ day)
  val df = spark.read.parquet(paths:_*)

答案 1 :(得分:0)

如果要保留“ id”列,可以尝试以下操作:

val df = sqlContext
     .read
     .option("basePath", "id=200393/")
     .parquet("id=200393/date=*")