'데이터 엔지니어'로 성장하기

정리하는 걸 좋아하고, 남이 읽으면 더 좋아함

Data/Spark

Spark) parquet file merge하기

MightyTedKim 2022. 7. 9. 23:01
728x90
반응형
parquet 파일이 너무 작은 조각으로 저장되서, 조회 속도에 문제가 생겼어요.
검색해보니 읽어서 원하는 크기로 저장하는 방법을 사용한다고 해요

요약

1. parquet 파일 너무 많아서 조회 속도 느림

2. repartition으로 원하는 사이즈로 저장함

설명

hdfs든, s3든 file이 많으면 속도가 느려지죠 그래서 file을 merge하는 방법을 사용해요

인터넷을 검색하면서 아래 코드처럼  repartition을 하는 방법을 찾았어요

def get_repartition_factor(dir_size):
    block_size = sc._jsc.hadoopConfiguration().get(“dfs.blocksize”)
    return math.ceil(dir_size/block_size) # returns 2
df=spark.read.parquet(“/path/to/source”)
df.repartition(get_repartition_factor(217894092))
.write
.parquet("/path/to/output")

https://medium.com/bigspark/compaction-merge-of-small-parquet-files-bef60847e60b

 

잘 적용이 되네요. airflow에서 spark batch로 돌려야겠어요

 

aws에서는 glue를 사용한다고 해요

datasink0 = glueContext.write_dynamic_frame.from_options(
  frame=partitioned_dynamic_df,
  connection_type="s3",
  connection_options={
    'path': "s3://bucket-name/output/"
  },
  format="parquet")

https://stackoverflow.com/questions/66251048/merging-multiple-parquet-files-and-creating-a-larger-parquet-file-in-s3-using-aw

 

하지만 저는 온프렘이기 때문에 사용할 수 없어요

728x90
반응형