【问题标题】:AWS Glue: ETL job creates many empty output filesAWS Glue:ETL 作业创建许多空输出文件
【发布时间】:2021-06-17 16:28:49
【问题描述】:

我对此很陌生,所以不确定这个脚本是否可以简化/如果我做错了什么会导致这种情况发生。我为 AWS Glue 编写了一个 ETL 脚本,该脚本写入 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_idevent_nameplatformclient_info event_details 表有 2 列:event_idevent_details

连接的表架构应如下所示:event_idevent_nameplatformclient_infoevent_details

运行此作业后,我预计会获得 2 个 json 文件,因为这是生成的连接表中的记录数。 (表中有两条记录具有相同的event_id)但是,我得到的是run-1540321737719-part-r-00000run-1540321737719-part-r-00001等形式的大约200个文件:

  • 198 个文件包含 0 个字节
  • 2 个文件包含 250 个字节(每个文件都有对应于丰富事件的正确信息)

这是预期的行为吗?为什么这个作业会生成这么多空文件?我的脚本有问题吗?

【问题讨论】:

    标签: amazon-web-services aws-glue


    【解决方案1】:

    Spark SQL 模块包含以下默认配置:

    spark.sql.shuffle.partitions 设置为 200。

    这就是为什么您首先要获得 200 个文件。 您可以通过执行以下操作来检查是否是这种情况:

    enriched_event_df.rdd.getNumPartitions()
    

    如果您获得的值为 200,那么您可以使用以下代码将其更改为您想要生成的文件数:

    enriched_event_df.repartition(2)
    

    上面的代码只会用你的数据创建两个文件。

    【讨论】:

      【解决方案2】:

      根据我的经验,空的输出文件指向转换中的错误。 您可以使用error functions 进行调试。

      顺便说一句。为什么要使用 Spark DataFrames 而不是 DynamicFrames 进行连接?

      【讨论】:

        【解决方案3】:

        您可以通过 spark sql 转换步骤将 column like timestamp 添加到数据帧中,并在将数据帧写入 S3 时将其添加为分区键,而不是重新分区

        例如: select replace(replace(replace(string(date_trunc('HOUR',current_timestamp())),'-',''),':',''),' ','') as datasetdate, * from myDataSource;

        使用datasetdate作为partitionkey写动态帧,胶水作业应该能够自动添加分区

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-05
          • 2011-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-10
          • 1970-01-01
          相关资源
          最近更新 更多