Spark - 如何从 S3 读取具有文件名的多个 Json 文件

Posted

技术标签:

【中文标题】Spark - 如何从 S3 读取具有文件名的多个 Json 文件【英文标题】:Spark - How to Read Multiple Multiple Json Files With Filename From S3 【发布时间】:2020-05-04 22:43:53 【问题描述】:

我在 S3 中有很多行分隔的 json 文件,我想在 spark 中读取所有这些文件,然后读取 json 中的每一行,并为该行输出一个字典/行,并将文件名作为列。我将如何以有效的方式在 python 中执行此操作?每个 json 大约 200 MB。

这是一个文件的例子(会有 200,000 行这样的),调用这个文件 class_scores_0219:

"name": "Maria C", "class":"Math", "score":"80", "student_identification":22
"name": "Maria F", "class":"Physics", "score":"90", "student_identification":12
"name": "Fink", "class":"English", "score":"75", "student_identification":7

输出 DataFrame 将是(为简单起见仅显示一行):

+-------------------+---------+-------+-------+------------------------+
|     file_name     |  name   | class | score | student_identification |
+-------------------+---------+-------+-------+------------------------+
| class_scores_0219 | Maria C | Math  |    80 |                     22 |
+-------------------+---------+-------+-------+------------------------+

我已经使用这个设置了 s3 密钥/访问密钥:sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", SECRET_KEY) (访问密钥相同),但可以以不同的方式连接。

我对任何最有效的选项持开放态度,我可以提供文件列表并将其输入,或者我可以连接到 boto3 并提供前缀。我是 Spark 的新手,因此感谢所有帮助。

【问题讨论】:

【参考方案1】:

您可以通过使用 spark 本身来实现这一点。

只需添加一个带有 input_file_names 的新列,您就会得到所需的结果

from pyspark.sql.functions import input_file_name
df = spark.read.json(path_to_you_folder_conatining_multiple_files)
df = df.withColumn('fileName',input_file_name())

如果你想读取多个文件,你可以将它们作为文件列表传递

files = [file1, file2, file3]
df = spark.read.json(*files)

或者,如果您的文件列表与通配符匹配,那么您可以像下面这样使用它

df = spark.read.json('path/to/file/load2020*.json')

或者您可以使用 boto3 列出文件夹中的所有对象,然后创建所需文件的列表并将其传递给 df。

希望对你有帮助。

【讨论】:

非常感谢您的回答,对此不起作用的一件事是,在我们的 S3 存储桶中,我们忽略了某些文件 -> 我们只需要移动我们想要的文件如果我们想使用此选项,请使用不同的 S3 存储桶。您知道是否有解决方法吗?

以上是关于Spark - 如何从 S3 读取具有文件名的多个 Json 文件的主要内容,如果未能解决你的问题,请参考以下文章

Spark:如何使用子集日期读取多个 s3 文件

如何使用 Python Jupyter Notebook 通过 KMS 加密从 S3 读取文件

如何从 Spark 正确读取 S3 中的 .csv 文件? - 无法读取文件的页脚

如何在 java 中使用 spark 从 AWS S3 读取 .xls 文件?并且无法读取 sheetName

PySpark:在 Spark 数据框中读取多个 XML 文件(s3 路径列表)

Spark 使用 sc.textFile ("s3n://...) 从 S3 读取文件