在 spark 中获取 parquet 表目录的源文件

Posted

技术标签:

【中文标题】在 spark 中获取 parquet 表目录的源文件【英文标题】:Get source files for directory of parquet tables in spark 【发布时间】:2017-06-02 18:52:03 【问题描述】:

我有一些代码,我通过目录和通配符在许多 parquet 表中读取,如下所示:

df = sqlContext.read.load("some_dir/*")

有没有什么方法可以获取结果 DataFrame 中每一行的源文件,df

【问题讨论】:

【参考方案1】:

让我们创建一些虚拟数据并以 parquet 格式保存。

spark.range(1,1000).write.save("./foo/bar")
spark.range(1,2000).write.save("./foo/bar2")
spark.range(1,3000).write.save("./foo/bar3")

现在我们可以根据需要读取数据了:

import org.apache.spark.sql.functions.input_file_name

spark.read.load("./foo/*")
     .select(input_file_name(), $"id")
     .show(3,false)
// +---------------------------------------------------------------------------------------+---+
// |INPUT_FILE_NAME()                                                                      |id |
// +---------------------------------------------------------------------------------------+---+
// |file:/home/eliasah/foo/bar/part-r-00002-9554d123-23fc-4524-a900-1cdbd9274cc3.gz.parquet|500|
// |file:/home/eliasah/foo/bar/part-r-00002-9554d123-23fc-4524-a900-1cdbd9274cc3.gz.parquet|501|
// |file:/home/eliasah/foo/bar/part-r-00002-9554d123-23fc-4524-a900-1cdbd9274cc3.gz.parquet|502|
// +---------------------------------------------------------------------------------------+---+

从 Spark 1.6 开始,您可以将parquet 数据源和input_file_name 函数如上所示组合。

这在使用 pyspark 的 spark 2.x 之前似乎有问题,但这就是它的完成方式:

from pyspark.sql.functions import input_file_name

spark.read.load("./foo/*") \
     .select(input_file_name(), "id") \
     .show(3,truncate=False)
# +---------------------------------------------------------------------------------------+---+
# |INPUT_FILE_NAME()                                                                      |id |
# +---------------------------------------------------------------------------------------+---+
# |file:/home/eliasah/foo/bar/part-r-00002-9554d123-23fc-4524-a900-1cdbd9274cc3.gz.parquet|500|
# |file:/home/eliasah/foo/bar/part-r-00002-9554d123-23fc-4524-a900-1cdbd9274cc3.gz.parquet|501|
# |file:/home/eliasah/foo/bar/part-r-00002-9554d123-23fc-4524-a900-1cdbd9274cc3.gz.parquet|502|
# +---------------------------------------------------------------------------------------+---+

【讨论】:

以上是关于在 spark 中获取 parquet 表目录的源文件的主要内容,如果未能解决你的问题,请参考以下文章

从多个 parquet 路径创建 Spark SQL 表

在 HIVE 中使用 CDH 5.4 和 Spark 1.3.0 和 Parquet 表的 PySpark 中的 Parquet 错误

Hive 不读取 Spark 生成的分区 parquet 文件

Spark SaveAsTable 元数据更新慢

使用 parquet 格式附加 Apache Spark 中列的描述

Databricks 上的 Spark - 缓存 Hive 表