将多个原始文件组合成单个镶木地板文件
Combine multiple raw files into single parquet file
我在 S3 中有大量按 yyyy/mm/dd/hh 划分的事件。
每个分区都有大约 80.000 个原始文本文件。
每个原始文件都有大约 1.000 个 JSON 格式的事件。
当我运行脚本做我的转换时:
datasource0 = glueContext.create_dynamic_frame.from_catalog(database=from_database,
table_name=from_table,
transformation_ctx="datasource0")
map0 = Map.apply(frame=datasource0, f=extract_data)
applymapping1 = ApplyMapping.apply(......)
applymapping1.toDF().write.mode('append').parquet(output_bucket, partitionBy=['year', 'month', 'day', 'hour'])
我最终得到大量跨分区的小文件,名称如下:
part-00000-a5aa817d-482c-47d0-b804-81d793d3ac88.snappy.parquet
part-00001-a5aa817d-482c-47d0-b804-81d793d3ac88.snappy.parquet
part-00002-a5aa817d-482c-47d0-b804-81d793d3ac88.snappy.parquet
每个文件的大小为 1-3KB。数量大致对应于我拥有的原始文件数量。
我的印象是,Glue 会从目录中获取所有事件,按照我想要的方式对它们进行分区,并将每个分区存储在一个文件 中。
如何实现?
您只需要设置repartition(1)
,这会将数据从所有分区洗牌到一个分区,这将在写入时生成一个输出文件。
applymapping1.toDF()
.repartition(1)
.write
.mode('append')
.parquet(output_bucket, partitionBy=['year', 'month', 'day', 'hour'])
我在 S3 中有大量按 yyyy/mm/dd/hh 划分的事件。 每个分区都有大约 80.000 个原始文本文件。 每个原始文件都有大约 1.000 个 JSON 格式的事件。
当我运行脚本做我的转换时:
datasource0 = glueContext.create_dynamic_frame.from_catalog(database=from_database,
table_name=from_table,
transformation_ctx="datasource0")
map0 = Map.apply(frame=datasource0, f=extract_data)
applymapping1 = ApplyMapping.apply(......)
applymapping1.toDF().write.mode('append').parquet(output_bucket, partitionBy=['year', 'month', 'day', 'hour'])
我最终得到大量跨分区的小文件,名称如下:
part-00000-a5aa817d-482c-47d0-b804-81d793d3ac88.snappy.parquet
part-00001-a5aa817d-482c-47d0-b804-81d793d3ac88.snappy.parquet
part-00002-a5aa817d-482c-47d0-b804-81d793d3ac88.snappy.parquet
每个文件的大小为 1-3KB。数量大致对应于我拥有的原始文件数量。
我的印象是,Glue 会从目录中获取所有事件,按照我想要的方式对它们进行分区,并将每个分区存储在一个文件 中。
如何实现?
您只需要设置repartition(1)
,这会将数据从所有分区洗牌到一个分区,这将在写入时生成一个输出文件。
applymapping1.toDF()
.repartition(1)
.write
.mode('append')
.parquet(output_bucket, partitionBy=['year', 'month', 'day', 'hour'])