【问题标题】:How to use sqlContext to load multiple parquet files?如何使用 sqlContext 加载多个 parquet 文件?
【发布时间】:2017-12-19 11:34:49
【问题描述】:

我正在尝试在 spark 中加载 parquet 文件目录,但似乎无法正常工作...这似乎工作:

val df = sqlContext.load("hdfs://nameservice1/data/rtl/events/stream/loaddate=20151102")

但这不起作用:

val df = sqlContext.load("hdfs://nameservice1/data/rtl/events/stream/loaddate=201511*")

它给了我这个错误:

java.io.FileNotFoundException: File does not exist: hdfs://nameservice1/data/rtl/events/stream/loaddate=201511*

如何让它与通配符一起使用?

【问题讨论】:

标签: hadoop apache-spark


【解决方案1】:

您可以使用文件系统列表状态读取文件或文件夹列表。 然后浏览您要阅读的文件/文件夹。 使用带有 union 的 reduce 将所有文件归约为一个 rdd。

获取文件/文件夹:

val fs = FileSystem.get(new Configuration())
val status = fs.listStatus(new Path(YOUR_HDFS_PATH))

读入数据:

val parquetFiles= status .map(folder => {
    sqlContext.read.parquet(folder.getPath.toString)
  })

将数据合并到单个rdd中:

val mergedFile= parquetFiles.reduce((x, y) => x.unionAll(y))

您还可以查看我过去围绕同一主题的帖子。

Spark Scala list folders in directory

Spark/Scala flatten and flatMap is not working on DataFrame

【讨论】:

    【解决方案2】:

    如果提供的路径是分区目录,请在数据源的选项中设置“basePath”来指定表的根目录。如果有多个根目录,请分别加载,然后合并。

    喜欢:

    basePath="hdfs://nameservice1/data/rtl/events/stream"
    
    sparkSession.read.option("basePath", basePath).parquet(basePath + "loaddate=201511*")
    

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 2019-12-23
      • 2016-12-01
      • 2019-06-16
      • 1970-01-01
      • 2019-02-11
      相关资源
      最近更新 更多