Я очень новичок в этом, поэтому не уверен, можно ли упростить этот скрипт / если я делаю что-то не так, что приводит к этому.Я написал 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 байтов (каждый с правильной информацией, соответствующей обогащенным событиям)
Это ожидаемое поведение?Почему эта работа генерирует так много пустых файлов?Что-то не так с моим сценарием?