복붙노트

[SCALA] 어떻게 여러 개의 파일로 출력을 분할하지 saveAsTextFile를 만드는 방법?

SCALA

어떻게 여러 개의 파일로 출력을 분할하지 saveAsTextFile를 만드는 방법?

스파크에 스칼라를 사용하는 경우 내가 saveAsTextFile을 사용하여 결과를 덤프 할 때마다, 여러 부분으로 출력을 분할하는 것 같다. 난 그냥에 매개 변수 (경로)를 통과하고있다.

val year = sc.textFile("apat63_99.txt").map(_.split(",")(1)).flatMap(_.split(",")).map((_,1)).reduceByKey((_+_)).map(_.swap)
year.saveAsTextFile("year")

해결법

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

    1.계산이 분산되어 있기 때문에 여러 개의 파일로 저장하는 이유입니다. 출력은 당신이 하나 개의 시스템에 맞게 수 있다고 생각만큼 소형 인 경우에, 당신은 당신의 프로그램을 종료 할 수 있습니다

    계산이 분산되어 있기 때문에 여러 개의 파일로 저장하는 이유입니다. 출력은 당신이 하나 개의 시스템에 맞게 수 있다고 생각만큼 소형 인 경우에, 당신은 당신의 프로그램을 종료 할 수 있습니다

    val arr = year.collect()
    

    그리고 또 다른 방법은 사용자 정의 파티션 프로그램, partitionBy를 사용하는 것, 파일로 결과 배열을 저장하고 당신이 어떤 병렬화을받지 않습니다 때문이 바람직하지 않습니다하지만 그렇게 모든 것을 하나 개의 파티션으로 이동합니다.

    당신이 saveAsTextFile으로 저장 될 파일이 필요한 경우는 유착 (1, TRUE) .saveAsTextFile ()을 사용할 수 있습니다. 이것은 기본적으로 다음 1 개 파티션에 유착 계산을 의미한다. 또한 (1) 어떤 true로 설정 셔플 인수 유착 단지 래퍼가 다시 분할을 사용할 수 있습니다. RDD.scala의 소스를 통해 찾고 내가 밖으로이 물건의 대부분을 생각하는 방법, 당신이보고를해야합니다.

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

    2.더 큰 데이터 세트로 작업하는 경우 :

    더 큰 데이터 세트로 작업하는 경우 :

    rdd.coalesce (1, 셔플 = TRUE) .saveAsTextFile에 불편할 수 있습니다 뭔가 ( "경로 / / file.txt를에")는 실제로 그 경로 경로 /로가 / file.txt를 / 부품-00000 인 파일을 생성한다는 것입니다 하지 경로 /로 / file.txt를.

    다음 솔루션 rdd.saveAsSingleTextFile는 ( "경로 / / file.txt를에") 실제로 그 경로 경로에 파일을 생성합니다 /로 / file.txt를 :

    package com.whatever.package
    
    import org.apache.spark.rdd.RDD
    import org.apache.hadoop.fs.{FileSystem, FileUtil, Path}
    import org.apache.hadoop.io.compress.CompressionCodec
    
    object SparkHelper {
    
      // This is an implicit class so that saveAsSingleTextFile can be attached to
      // SparkContext and be called like this: sc.saveAsSingleTextFile
      implicit class RDDExtensions(val rdd: RDD[String]) extends AnyVal {
    
        def saveAsSingleTextFile(path: String): Unit =
          saveAsSingleTextFileInternal(path, None)
    
        def saveAsSingleTextFile(path: String, codec: Class[_ <: CompressionCodec]): Unit =
          saveAsSingleTextFileInternal(path, Some(codec))
    
        private def saveAsSingleTextFileInternal(
            path: String, codec: Option[Class[_ <: CompressionCodec]]
        ): Unit = {
    
          // The interface with hdfs:
          val hdfs = FileSystem.get(rdd.sparkContext.hadoopConfiguration)
    
          // Classic saveAsTextFile in a temporary folder:
          hdfs.delete(new Path(s"$path.tmp"), true) // to make sure it's not there already
          codec match {
            case Some(codec) => rdd.saveAsTextFile(s"$path.tmp", codec)
            case None        => rdd.saveAsTextFile(s"$path.tmp")
          }
    
          // Merge the folder of resulting part-xxxxx into one file:
          hdfs.delete(new Path(path), true) // to make sure it's not there already
          FileUtil.copyMerge(
            hdfs, new Path(s"$path.tmp"),
            hdfs, new Path(path),
            true, rdd.sparkContext.hadoopConfiguration, null
          )
          // Working with Hadoop 3?: https://stackoverflow.com/a/50545815/9297144
    
          hdfs.delete(new Path(s"$path.tmp"), true)
        }
      }
    }
    

    이는이 방법을 사용할 수 있습니다 :

    import com.whatever.package.SparkHelper.RDDExtensions
    
    rdd.saveAsSingleTextFile("path/to/file.txt")
    
    // Or if the produced file is to be compressed:
    import org.apache.hadoop.io.compress.GzipCodec
    rdd.saveAsSingleTextFile("path/to/file.txt.gz", classOf[GzipCodec])
    

    이 조각 :

  3. ==============================

    3.당신은 유착 (1) 다음 saveAsTextFile ()를 호출 할 수 있습니다 -하지만 당신은 많은 양의 데이터가 있다면 그것은 좋은 생각 일 수 있습니다. 분할마다 별도의 파일은 별도의 맵퍼 및 감속기는 다른 파일에 쓸 수 있도록하기 위해 하둡에서처럼 생성됩니다. 당신은 당신이뿐만 아니라) (수집 할 수있는 경우는 거의 데이터가있는 경우 @aaronman 말했듯이 하나의 출력 파일을 갖는 것은, 단지 좋은 생각이다.

    당신은 유착 (1) 다음 saveAsTextFile ()를 호출 할 수 있습니다 -하지만 당신은 많은 양의 데이터가 있다면 그것은 좋은 생각 일 수 있습니다. 분할마다 별도의 파일은 별도의 맵퍼 및 감속기는 다른 파일에 쓸 수 있도록하기 위해 하둡에서처럼 생성됩니다. 당신은 당신이뿐만 아니라) (수집 할 수있는 경우는 거의 데이터가있는 경우 @aaronman 말했듯이 하나의 출력 파일을 갖는 것은, 단지 좋은 생각이다.

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

    4.다른 언급, 당신은 수집하거나 데이터가 하나의 파일을 생성하는 스파크를 강제로 설정 병합 할 수 있습니다. 그러나이 또한 병렬 데이터 집합에서 작업 할 수 있습니다 스파크 작업의 수를 제한합니다. 나는 그 다음 로컬 파일 시스템에서 하나의 파일로 결과를 추출하기 위해 하둡 FS의 -getmerge / HDFS / 디렉토리 /local/file.txt를 사용, 출력 HDFS 디렉토리에 백 개 파일을 만들 수 있도록하는 것을 선호합니다. 당신의 출력은 물론, 상대적으로 작은 보고서입니다 때 가장 의미가 있습니다.

    다른 언급, 당신은 수집하거나 데이터가 하나의 파일을 생성하는 스파크를 강제로 설정 병합 할 수 있습니다. 그러나이 또한 병렬 데이터 집합에서 작업 할 수 있습니다 스파크 작업의 수를 제한합니다. 나는 그 다음 로컬 파일 시스템에서 하나의 파일로 결과를 추출하기 위해 하둡 FS의 -getmerge / HDFS / 디렉토리 /local/file.txt를 사용, 출력 HDFS 디렉토리에 백 개 파일을 만들 수 있도록하는 것을 선호합니다. 당신의 출력은 물론, 상대적으로 작은 보고서입니다 때 가장 의미가 있습니다.

  5. ==============================

    5.다시 파티션을 (전화) 및이 방법을 따를 수 있습니다 :

    다시 파티션을 (전화) 및이 방법을 따를 수 있습니다 :

    val year = sc.textFile("apat63_99.txt").map(_.split(",")(1)).flatMap(_.split(",")).map((_,1)).reduceByKey((_+_)).map(_.swap)
    
    var repartitioned = year.repartition(1)
    repartitioned.saveAsTextFile("C:/Users/TheBhaskarDas/Desktop/wc_spark00")
    

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

    6.현재 버전은 bash는 스크립트 호출로, 당신은 예를 들어, 수동으로 어떻게 든 그것을하지 않는 한 당신이 언급 한 것처럼, 불가능 1.0.0에서 당신은 불꽃의 다음 버전에서 그것을 할 수있을 것입니다.

    현재 버전은 bash는 스크립트 호출로, 당신은 예를 들어, 수동으로 어떻게 든 그것을하지 않는 한 당신이 언급 한 것처럼, 불가능 1.0.0에서 당신은 불꽃의 다음 버전에서 그것을 할 수있을 것입니다.

  7. ==============================

    7.또한 문서가 명확하게 파티션의 진짜 적은 수의 유착 호출 할 때 사용자가주의해야한다고 언급하고 싶다. 이 상류 파티션은 파티션의 수를 상속 될 수 있습니다.

    또한 문서가 명확하게 파티션의 진짜 적은 수의 유착 호출 할 때 사용자가주의해야한다고 언급하고 싶다. 이 상류 파티션은 파티션의 수를 상속 될 수 있습니다.

    난 정말 필요하지 않는 한 COALESCE (1)의 사용을 권장하지 않을 것입니다.

  8. ==============================

    8.스파크 1.6.1의 형식은 다음과 같이 도시된다. 그것은 file.It 출력은 그것이 당신이 과감한 유착을하고있는 partitions.If numPartitions로 감소 새로운 RDD를 반환한다는 것입니다 무엇을 handle.Basically 정도로 작은 경우 그것을 사용하는 것이 가장 좋습니다 단일 출력을 생성 예를 들어, 당신이 (= 1 numPartitions의 경우 예를 들어, 하나 개의 노드를) 좋아하는 것보다 numPartitions = 1이 적은 노드에서 일어나는 당신의 계산 될 수 있습니다

    스파크 1.6.1의 형식은 다음과 같이 도시된다. 그것은 file.It 출력은 그것이 당신이 과감한 유착을하고있는 partitions.If numPartitions로 감소 새로운 RDD를 반환한다는 것입니다 무엇을 handle.Basically 정도로 작은 경우 그것을 사용하는 것이 가장 좋습니다 단일 출력을 생성 예를 들어, 당신이 (= 1 numPartitions의 경우 예를 들어, 하나 개의 노드를) 좋아하는 것보다 numPartitions = 1이 적은 노드에서 일어나는 당신의 계산 될 수 있습니다

    pair_result.coalesce(1).saveAsTextFile("/app/data/")
    
  9. ==============================

    9.다음은 출력에 내 대답은 하나의 파일입니다. 나는 방금 추가 유착 (1)

    다음은 출력에 내 대답은 하나의 파일입니다. 나는 방금 추가 유착 (1)

    val year = sc.textFile("apat63_99.txt")
                  .map(_.split(",")(1))
                  .flatMap(_.split(","))
                  .map((_,1))
                  .reduceByKey((_+_)).map(_.swap)
    year.saveAsTextFile("year")
    

    암호:

    year.coalesce(1).saveAsTextFile("year")
    
  10. from https://stackoverflow.com/questions/24371259/how-to-make-saveastextfile-not-split-output-into-multiple-file by cc-by-sa and MIT license