복붙노트

[HADOOP] wholeTextFiles를 사용하여 Spark에서 gz 파일을 읽는 방법

HADOOP

wholeTextFiles를 사용하여 Spark에서 gz 파일을 읽는 방법

나는 많은 작은 .gz 파일 (압축 csv 텍스트 파일)을 포함하는 폴더가 있습니다. Spark 업무에서 읽어야하지만, 파일 이름에있는 정보를 기반으로 일부 처리를해야합니다. 그러므로 나는 사용하지 않았다 :

JavaRDD<<String>String> input = sc.textFile(...)

내 이해하기 때문에 나는이 방법으로 파일 이름에 접근 할 수 없다. 대신, 나는 다음을 사용했다.

JavaPairRDD<<String>String,String> files_and_content = sc.wholeTextFiles(...);

이 방법 때문에 나는 한 쌍의 파일 이름과 내용을 얻습니다. 그러나이 방법은 입력 리더가 gz 파일의 텍스트를 읽지 못하고 이진 Gibberish를 읽는 것으로 보입니다.

그래서, 어떻게 든 텍스트를 읽거나 파일 이름에 sc.textFile (...)을 사용하여 액세스하도록 설정할 수 있는지 알고 싶습니다.

해결법

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

    1.splitTable이 아니기 때문에 gzipped 파일을 읽을 수없는 CombineFileInputFormat을 사용하기 때문에 wholeTextFiles로 gzipped 파일을 읽을 수 없습니다 (소스 증명).

    splitTable이 아니기 때문에 gzipped 파일을 읽을 수없는 CombineFileInputFormat을 사용하기 때문에 wholeTextFiles로 gzipped 파일을 읽을 수 없습니다 (소스 증명).

      override def createRecordReader(
          split: InputSplit,
          context: TaskAttemptContext): RecordReader[String, String] = {
    
        new CombineFileRecordReader[String, String](
          split.asInstanceOf[CombineFileSplit],
          context,
          classOf[WholeTextFileRecordReader])
      }
    

    당신은 wholefileinputformat과 함께 newAPIHadoopFile을 사용할 수 있습니다 (hadoop에 내장되어 있지는 않지만 인터넷을 통해).

    업데이트 1 : WholeFileInputFormat이 파일의 바이트를 가져 오기 때문에 작동하지 않는다고 생각합니다. 즉, 자신의 클래스를 작성하여 WholeFileInputFormat을 확장하여 바이트를 압축 해제해야 할 수도 있습니다.

    또 다른 옵션은 GZipInputStream을 사용하여 바이트를 직접 압축 해제하는 것입니다.

    업데이트 2 : 아래 OP의 코멘트와 같은 디렉토리 이름에 액세스 할 수 있으면 이와 같은 모든 파일을 얻을 수 있습니다.

    Path path = new Path("");
    FileSystem fileSystem = path.getFileSystem(new Configuration()); //just uses the default one
    FileStatus []  fileStatuses = fileSystem.listStatus(path);
    ArrayList<Path> paths = new ArrayList<>();
    for (FileStatus fileStatus : fileStatuses) paths.add(fileStatus.getPath());
    
  2. ==============================

    2.S3에 연결하는 데 spark를 사용하는 동안 동일한 문제가 발생했습니다.

    S3에 연결하는 데 spark를 사용하는 동안 동일한 문제가 발생했습니다.

    내 파일은 확장자가없는 gzip csv입니다.

    JavaPairRDD<String, String> fileNameContentsRDD = javaSparkContext.wholeTextFiles(logFile);
    

    이 접근 방식은 손상된 값을 반환했습니다.

    아래 코드를 사용하여 해결했습니다.

    JavaPairRDD<String, String> fileNameContentsRDD = javaSparkContext.wholeTextFiles(logFile+".gz");
    

    .gz를 S3 URL에 추가하면 spark가 자동으로 파일을 선택하여 gz 파일처럼 읽습니다 (잘못된 접근 방법이지만 내 문제를 해결했습니다.).

  3. from https://stackoverflow.com/questions/24402737/how-to-read-gz-files-in-spark-using-wholetextfiles by cc-by-sa and MIT license