如何使用sqlcontext加载多个Parquet文件?

bsxbgnwa  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(337)

我试图在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*

如何让它与通配符一起工作?

m0rkklqb

m0rkklqb1#

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

basePath="hdfs://nameservice1/data/rtl/events/stream"

sparkSession.read.option("basePath", basePath).parquet(basePath + "loaddate=201511*")
2uluyalo

2uluyalo2#

您可以使用文件系统列表状态读入文件或文件夹列表。然后浏览你想阅读的文件/文件夹。使用reduce with union将所有文件缩减为一个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列出目录中的文件夹
spark/scala展平和flatmap在Dataframe上不起作用

相关问题