获取spark中镶木桌目录的源文件

时间:2017-06-02 18:52:03

标签: apache-spark pyspark apache-spark-sql parquet

我有一些代码,我通过目录和通配符读取许多镶木桌子,如下所示:

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

我是否可以通过某种方式获取生成的DataFrame df中每一行的源文件?

1 个答案:

答案 0 :(得分:3)

让我们创建一些虚拟数据并将其保存为镶木地板格式。

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功能,如上所示。

这似乎是火花2.x与pyspark之前的错误,但这就是它的完成方式:

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|
# +---------------------------------------------------------------------------------------+---+