본문 바로가기

Big Data/Spark

[Spark] 하둡 hdfs 파일 하나로 합쳐 local에 내려받기 (getmerge, *.gz파일)

1. 압축파일이 아닐 경우


hdfs에 나누어 저장되어 있는 파일들을 합쳐서 로컬로 받고 싶은 경우에는 -getmerge 명령어를 사용하고, 파티션들이 저장되어 있는 상위 디렉토리를 hdfs 경로로 준다.

$ hdfs dfs -getmerge [hdfs 경로] [내려받을 local위치]

 

Ex)

 

위의 경우에는 20211204_161503_442837 디렉토리 내에 파일들이 나누어져 저장되어있기 때문에 해당경로까지를 첫 번째 인자로 넣어준다.

$ hdfs dfs -getmerge /user/nauts/warehouse/anchor_set/wiki/all/20211204_161503_442837 [local위치]

 

2. 압축 파일일 경우


하지만 나누어져있는 파일이 다음과 같이 .gz와 같은 압축 파일인 경우에는 -getmerge를 사용할 수 없다.

이때 목적에 따라 명령어를 다르게 쓴다.

 

2-1. -getmerge와 같은 결과를 위해 전체 파일을 모두 내려받고자 하는 경우

 

이럴 경우에는 두 단계로 수행한다.

1. 먼저 파일을 read한 후 coalesce 혹은 repartition으로 파티션 수를 1로 설정하여 새 hdfs 경로에 save한다.

2. 해당 파일은 이제 압축파일이 아니므로 1번의 getmerge를 사용하여 로컬에 내려받는다.

df = spark.read.json("[hdfs 경로 1]")
df.coalesce(1).write.format("json").mode("overwrite").option(
            "header", "true").save("[hdfs 경로 2]")

 

 

2-2. 하나의 파일만 확인용으로 내려받고자 하는 경우

이때는 -text 명령어를 이용하며, hdfs경로는 상위 디렉토리까지가 아닌 개별 파일명까지 전체 경로를 넣는다.

$ hdfs dfs -text [hdfs 경로] > [내려받을 local위치]

Ex)

$ hdfs dfs -text /user/nauts/warehouse/anchor_set/wiki/all/20211228_030617_005707/part-00000-500367d0-3384-4bdc-a92d-f8365320bdbf-c000.json.gz > [local 위치]

 

 

 

 

Ref.

https://stackoverflow.com/questions/52521463/unzip-the-multiple-gz-files-and-make-one-csv-file-in-spark-scala