Spark - Как читать несколько Json файлов с именем файла из S3 - PullRequest
1 голос
/ 05 мая 2020

У меня есть много файлов с разделителями json в S3, и я хочу прочитать все эти файлы в искре, а затем прочитать каждую строку в json и вывести Dict / Row для этой строки с именем файла в виде столбца . Как мне go сделать это в python эффективным образом? Каждый json составляет около 200 МБ.

Вот пример файла (было бы 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 Ответ

2 голосов
/ 05 мая 2020

Вы можете добиться этого, используя саму 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.

Надеюсь, это поможет.

...