복붙노트

[SCALA] JSON 파일이 아닌 폴더로 RDD 데이터를 저장하는 방법

SCALA

JSON 파일이 아닌 폴더로 RDD 데이터를 저장하는 방법

나는 스트리밍 데이터 myDStream 내가 S3 (에 저장할 것을 (d 스트림 [문자열]) 수신하고 기본적으로,이 질문에 대해, 정확히 내가 출력을 저장할 할 경우 중요하지 않습니다,하지만 난 단지의 경우를 언급하고있다 ).

다음 코드는 잘 작동하지만, jsonFile - 19-45-46.json 같은 이름을 가진 폴더를 저장 한 다음이 저장 폴더 안에 _SUCCESS 및 부품-00000 파일.

이 저장 가능 각 RDD [문자열] (이 있습니다 JSON 문자열)을 JSON 파일이 아닌 폴더에 데이터를? 나는 다시 분할 (1)이 트릭을 할 줄 알았는데,하지만하지 않았다.

    myDStream.foreachRDD { rdd => 
       // datetimeString = ....
       rdd.repartition(1).saveAsTextFile("s3n://mybucket/keys/jsonFile-"+datetimeString+".json")
    }

해결법

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

    1.AFAIK는 파일로 저장하는 옵션이 없습니다. 그것은 분산 처리 프레임 워크이고 그것은 좋은 연습 하나의 파일에 쓰기보다는 각 파티션은 지정된 경로에 자신의 파일을 작성 아니니까.

    AFAIK는 파일로 저장하는 옵션이 없습니다. 그것은 분산 처리 프레임 워크이고 그것은 좋은 연습 하나의 파일에 쓰기보다는 각 파티션은 지정된 경로에 자신의 파일을 작성 아니니까.

  2. ==============================

    2.rdd.collect.mkString 대안 ( "\ n")로서 당신은 그것의 위치에 일부-00000 파일을 이동하여 정리 출력에 파일 시스템 라이브러리를 하둡 사용할 수 있습니다. 코드 아래 로컬 파일 시스템 및 HDFS에 완벽하게 작동,하지만 난 S3와 테스트 드릴 수 없습니다 :

    rdd.collect.mkString 대안 ( "\ n")로서 당신은 그것의 위치에 일부-00000 파일을 이동하여 정리 출력에 파일 시스템 라이브러리를 하둡 사용할 수 있습니다. 코드 아래 로컬 파일 시스템 및 HDFS에 완벽하게 작동,하지만 난 S3와 테스트 드릴 수 없습니다 :

    val outputPath = "path/to/some/file.json"
    rdd.saveAsTextFile(outputPath + "-tmp")
    
    import org.apache.hadoop.fs.Path
    val fs = org.apache.hadoop.fs.FileSystem.get(spark.sparkContext.hadoopConfiguration)
    fs.rename(new Path(outputPath + "-tmp/part-00000"), new Path(outputPath))
    fs.delete(new Path(outputPath  + "-tmp"), true)
    
  3. from https://stackoverflow.com/questions/40577546/how-to-save-rdd-data-into-json-files-not-folders by cc-by-sa and MIT license