У меня есть много (относительно небольших) файлов AVRO с разными схемами, каждый в одном месте, например:
Object Name: A
/path/to/A
A_1.avro
A_2.avro
...
A_N.avro
Object Name: B
/path/to/B
B_1.avro
B_2.avro
...
B_N.avro
Object Name: C
/path/to/C
C_1.avro
C_2.avro
...
C_N.avro
...
, и моя цель - прочитать их параллельно через Spark и сохранить каждую строку в виде большого двоичного объектав одном столбце вывода.В результате мои выходные данные будут иметь согласованную схему, что-то вроде следующих столбцов: ID, objectName, RecordDate, Data, где поле «Данные» содержит строку JSON исходной записи.
Моя первоначальная мысль былачтобы поместить операторы read read в цикл, создайте поля, показанные выше для каждого фрейма данных, а затем примените операцию объединения для получения моего окончательного фрейма данных, например:
all_df = []
for obj_name in all_object_names:
file_path = get_file_path(object_name)
df = spark.read.format(DATABRIKS_FORMAT).load(file_path)
all_df.append(df)
df_o = all_df.drop()
for df in all_df:
df_o = df_o.union(df)
# write df_o to the output
Однако я не уверен, еслиоперации чтения будут распараллелены.
Я также натолкнулся на функцию sc.textFile (), чтобы прочитать все файлы AVRO за один раз как строку, но не смог заставить ее работать.
Итак, у меня есть 2 вопроса:
- Будет ли несколько операторов чтения в цикле распараллеливаться Spark?Или есть более эффективный способ добиться этого?
- Можно ли использовать sc.textFile () для чтения файлов AVRO в виде строки JSON в одном столбце?
Я быценим ваши мысли и предложения.