복붙노트

[HADOOP] pyspark에서 그들을 수집 할 때 왜`binaryFiles` 파일이 비어 있습니까?

HADOOP

pyspark에서 그들을 수집 할 때 왜`binaryFiles` 파일이 비어 있습니까?

동일한 폴더에 hdfs에 두 개의 zip 파일이 있습니다. / user / path-to-folder-with-zips /.

나는 그것을 pyspark의 "binaryfiles"로 넘깁니다.

zips = sc.binaryFiles('/user/path-to-folder-with-zips/')

Zip 파일의 압축을 풀고 텍스트 파일을 처리하려고하므로 RDD를 처리하려고 할 때 콘텐츠가 무엇인지 보려고했습니다. 나는 이것을 이렇게했다 :

zips_collected = zips.collect()

하지만 그렇게하면 빈 목록이 나타납니다.

>> zips_collected
[]

나는 지퍼가 비어 있지 않다는 것을 안다 - 그들은 텍스트 파일을 가지고있다. 여기에있는 문서에

각 파일은 단일 레코드로 읽히고 키 - 값 쌍으로 리턴됩니다. 여기서 키는 각 파일의 경로이고, 값은 각 파일의 내용입니다.

여기서 내가 뭘 잘못하고 있니? 내가 압축 파일이므로 이진 파일이므로 내용을 볼 수 없다는 것을 안다. 하지만 나는 적어도 뭔가를 볼 수 있어야합니다. 왜 아무것도 돌려주지 않습니까?

zip 파일 당 둘 이상의 파일이있을 수 있지만 내용은 항상 다음과 같습니다.

rownum|data|data|data|data|data
rownum|data|data|data|data|data
rownum|data|data|data|data|data

해결법

  1. ==============================

    1.각 zip 파일에는 단일 텍스트 파일이 포함되어 있다고 가정합니다 (코드는 여러 텍스트 파일에 대해 쉽게 변경됩니다). 한 줄씩 처리하기 전에 먼저 io.BytesIO를 통해 zip 파일의 내용을 읽어야합니다. 해결책은 https://stackoverflow.com/a/36511190/234233을 기반으로합니다.

    각 zip 파일에는 단일 텍스트 파일이 포함되어 있다고 가정합니다 (코드는 여러 텍스트 파일에 대해 쉽게 변경됩니다). 한 줄씩 처리하기 전에 먼저 io.BytesIO를 통해 zip 파일의 내용을 읽어야합니다. 해결책은 https://stackoverflow.com/a/36511190/234233을 기반으로합니다.

    import io
    import gzip
    
    def zip_extract(x):
        """Extract *.gz file in memory for Spark"""
        file_obj = gzip.GzipFile(fileobj=io.BytesIO(x[1]), mode="r")
        return file_obj.read()
    
    zip_data = sc.binaryFiles('/user/path-to-folder-with-zips/*.zip')
    results = zip_data.map(zip_extract) \
                      .flatMap(lambda zip_file: zip_file.split("\n")) \
                      .map(lambda line: parse_line(line))
                      .collect()
    
  2. from https://stackoverflow.com/questions/38256631/why-are-my-binaryfiles-empty-when-i-collect-them-in-pyspark by cc-by-sa and MIT license