복붙노트

[HADOOP] Spark에서 CSV에 쓰는 방법

HADOOP

Spark에서 CSV에 쓰는 방법

나는 Spark Job의 결과를 CSV 파일로 저장하는 효과적인 방법을 찾고있다. Spark를 Hadoop과 함께 사용하고 있으며, 지금까지 모든 파일은 00000 부분으로 저장되었습니다.

어떤 아이디어를 내 스파크를 특정 파일 이름으로 파일을 저장하게하는 방법?

해결법

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

    1.Spark이 Hadoop File System API를 사용하여 파일에 데이터를 쓰는 것은 피할 수없는 일입니다. 네가한다면

    Spark이 Hadoop File System API를 사용하여 파일에 데이터를 쓰는 것은 피할 수없는 일입니다. 네가한다면

    rdd.saveAsTextFile("foo")
    

    저장하려고하는 RDD의 모든 파티션에 하나의 part- * 파일과 함께 "foo / part-XXXXX"로 저장됩니다. RDD의 각 파티션이 개별 파일로 작성되는 이유는 내결함성 때문입니다. 세 번째 파티션 (즉, 파트 00002)을 쓰는 작업이 실패하면 Spark는 작업을 다시 실행하고 부분적으로 작성된 / 손상된 파트 00002를 덮어 쓰며 다른 파트에는 영향을 미치지 않습니다. 모두가 같은 파일에 쓴다면 실패에 대한 단일 작업을 복구하는 것이 훨씬 어렵습니다.

    part-XXXXX 파일은 일반적으로 Spark / Hadoop 기반 프레임 워크에서 다시 사용하기 때문에 HDFS API를 사용하기 때문에 문제가되지 않습니다. "foo"를 읽도록 요청하면 모든 부분을 읽습니다 -XXXXX 파일은 foo 내부에도 있습니다.

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

    2.이 방법으로 제안 할 것입니다 (Java 예제).

    이 방법으로 제안 할 것입니다 (Java 예제).

    theRddToPrint.coalesce(1, true).saveAsTextFile(textFileName);
    FileSystem fs = anyUtilClass.getHadoopFileSystem(rootFolder);
    FileUtil.copyMerge(
        fs, new Path(textFileName),
        fs, new Path(textFileNameDestiny),
        true, fs.getConf(), null);
    
  3. ==============================

    3.Hadoop FileSystem 작업을 기반으로하는 또 다른 방법이 있습니다.

    Hadoop FileSystem 작업을 기반으로하는 또 다른 방법이 있습니다.

  4. ==============================

    4.Spark SQL을 사용하여 한 개의 라이너에서이 작업을 수행 할 수 있습니다.

    Spark SQL을 사용하여 한 개의 라이너에서이 작업을 수행 할 수 있습니다.

    //implicits for magic functions like .toDf
    import spark.implicits._
    
    val df = Seq(
      ("first", 2.0),
      ("choose", 7.0),
      ("test", 1.5)
    ).toDF("name", "vals")
    
    //write DataFrame/DataSet to external storage
    df.write
      .format("csv")
      .save("csv/file/location")
    
  5. ==============================

    5.아이디어가 있지만 준비된 코드 스 니펫은 아닙니다. 내부적으로 (이름에서 알 수 있듯이) Spark는 Hadoop 출력 형식을 사용합니다. (또한 HDFS에서 읽을 때 InputFormat).

    아이디어가 있지만 준비된 코드 스 니펫은 아닙니다. 내부적으로 (이름에서 알 수 있듯이) Spark는 Hadoop 출력 형식을 사용합니다. (또한 HDFS에서 읽을 때 InputFormat).

    hadoop의 FileOutputFormat에는 보호 된 멤버 인 setOutputFormat이 있습니다.이 멤버는 상속 된 클래스에서 호출하여 다른 기본 이름을 설정할 수 있습니다.

  6. ==============================

    6.정말 깨끗한 해결책은 아니지만 foreachRDD () 안에서는 기본적으로 원하는대로 할 수 있고 새 파일을 만들 수도 있습니다.

    정말 깨끗한 해결책은 아니지만 foreachRDD () 안에서는 기본적으로 원하는대로 할 수 있고 새 파일을 만들 수도 있습니다.

    내 솔루션에서는 이것이 내가하는 일입니다. HDFS (내결함성 이유로)에 출력을 저장하고 foreachRDD 내부에 로컬 폴더에 통계가있는 TSV 파일을 만듭니다.

    그게 네가 필요하다면 네가 아마 똑같이 할 수 있다고 생각해.

    http://spark.apache.org/docs/0.9.1/streaming-programming-guide.html#output-operations

  7. from https://stackoverflow.com/questions/23527941/how-to-write-to-csv-in-spark by cc-by-sa and MIT license