2017-11-06 15 views
2

S3에서 yyyy/mm/dd/hh로 파티션 된 많은 수의 이벤트가 있습니다. 모든 파티션에는 약 80,000 개의 원시 텍스트 파일이 있습니다. 모든 원시 파일에는 JSON 형식의 약 1.000 이벤트가 있습니다.여러 원시 파일을 하나의 마루 파일로 결합하십시오.

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-3킬로바이트입니다 크기가. 번호는 내가 가진 원시 파일의 수와 대략 일치합니다.

접착제에서 카탈로그의 모든 이벤트를 가져 와서 원하는대로 파티션하고 을 하나의 파일에 하나의 파일에 저장하는 것이 인상적이었습니다..

어떻게 달성 할 수 있습니까?

답변

2

모든 파티션의 데이터를 기록하는 동안 단일 출력 파일을 생성하는 단일 파티션으로 데이터를 셔플하는 repartition(1) 만 설정하면됩니다.

applymapping1.toDF() 
      .repartition(1) 
      .write 
      .mode('append') 
      .parquet(output_bucket, partitionBy=['year', 'month', 'day', 'hour']) 
+0

고마워요! 약간의 독서 후 나는 * 합병 *이 아마도 더 적절하다고 생각하고있다. 이견있는 사람? –

+0

coalesce (1) 및 repartition (1)은 전체 데이터가 하나의 파티션에서 전송되어야하므로 기능이 동일하므로 셔플이 있어야하며 두 작업 모두 동일합니다. –