AWS Glue: задание ETL создает много пустых выходных файлов - PullRequest
0 голосов
/ 25 октября 2018

Я очень новичок в этом, поэтому не уверен, можно ли упростить этот скрипт / если я делаю что-то не так, что приводит к этому.Я написал ETL-скрипт для AWS Glue, который пишет в каталог в корзине S3.

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.dynamicframe import DynamicFrame
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

# catalog: database and table names
db_name = "events"
tbl_base_event_info = "base_event_info"
tbl_event_details = "event_details"

# output directories
output_dir = "s3://whatever/output"

# create dynamic frames from source tables
base_event_source = glueContext.create_dynamic_frame.from_catalog(database = db_name, table_name = tbl_base_event_info)
event_details_source = glueContext.create_dynamic_frame.from_catalog(database = db_name, table_name = tbl_event_details)

# join frames
base_event_source_df = workout_event_source.toDF()
event_details_source_df = workout_device_source.toDF()
enriched_event_df = base_event_source_df.join(event_details_source_df, "event_id")
enriched_event = DynamicFrame.fromDF(enriched_event_df, glueContext, "enriched_event")

# write frame to json files 
datasink = glueContext.write_dynamic_frame.from_options(frame = enriched_event, connection_type = "s3", connection_options = {"path": output_dir}, format = "json")
job.commit()

Таблица base_event_info имеет 4 столбца: event_id, event_name, platform, client_info Таблица event_details имеет 2 столбца: event_id, event_details

Схема объединенной таблицы должна выглядеть следующим образом: event_id, event_name, platform, client_info, event_details

После запуска этой работы я ожидал получить 2 jsonфайлы, так как это количество записей в итоговой объединенной таблице.(Есть две записи в таблицах с одинаковым event_id). Однако, я получаю около 200 файлов в виде run-1540321737719-part-r-00000, run-1540321737719-part-r-00001 и т. Д .:

  • 198 файлов содержат0 байтов
  • 2 файла содержат 250 байтов (каждый с правильной информацией, соответствующей обогащенным событиям)

Это ожидаемое поведение?Почему эта работа генерирует так много пустых файлов?Что-то не так с моим сценарием?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Модуль Spark SQL содержит следующую конфигурацию по умолчанию:

spark.sql.shuffle.partitions установлен на 200.

, поэтому вы получаете 200 файлов впервое место.Вы можете проверить, так ли это, выполнив следующие действия:

enriched_event_df.rdd.getNumPartitions()

если вы получите значение 200, то вы можете изменить его на количество файлов, которые вы хотите сгенерировать, с помощью следующего кода:

enriched_event_df.repartition(2)

Приведенный выше код создаст только два файла с вашими данными.

0 голосов
/ 09 ноября 2018

По моему опыту пустые выходные файлы указывают на ошибку в преобразованиях.Вы можете отладить их, используя функции ошибок .

Кстати.Почему вы делаете объединения, используя Spark DataFrames вместо DynamicFrames?

...