【问题标题】:Spark saveAsTextFile() writes to multiple files instead of one [duplicate]Spark saveAsTextFile()写入多个文件而不是一个[重复]
【发布时间】:2018-05-17 17:09:01
【问题描述】:

此时我正在笔记本电脑上使用 Spark 和 Scala。

当我将 RDD 写入文件时,输出会写入两个文件“part-00000”和“part-00001”。如何强制 Spark / Scala 写入一个文件

我的代码目前是:

myRDD.map(x => x._1 + "," + x._2).saveAsTextFile("/path/to/output")

我在哪里 removing the parentheses 写出键值对。

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    “问题”确实是一个特性,它是由您的RDD 分区方式产生的,因此它被分成n 部分,其中n 是分区数。要解决此问题,您只需在 RDD 上使用 repartition 将分区数更改为 1。文档指出:

    重新分区(numPartitions)

    返回一个新的 RDD,它正好有 numPartitions 个分区。

    可以提高或降低此 RDD 中的并行度。在内部,这使用 shuffle 重新分配数据。如果你是 减少此 RDD 中的分区数,考虑使用 合并,可以避免执行随机播放。

    例如,此更改应该有效。

    myRDD.map(x => x._1 + "," + x._2).repartition(1).saveAsTextFile("/path/to/output")
    

    正如文档所述,您也可以使用coalesce,这实际上是减少分区数量时的推荐选项。但是,将分区数量减少到一个被认为是一个坏主意,因为它会导致数据混洗到一个节点并失去并行性。

    【讨论】:

    • 请强调,总的来说这是一个非常糟糕的主意:)
    • @zero323 更有什者,文档说推荐使用coalesce
    • Coalesce 无济于事。在“宽”转换的情况下,它将完成相同数量的工作。
    • @zero323 只是为了确认一下,问题是因为洗牌和并行性的丧失而出现的,并且将所有数据移动到一个节点,对吗?这就是我错过的对吧?
    • 我想就是这样。这里应该没有更多问题了。
    猜你喜欢
    • 2016-07-10
    • 2019-01-21
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2015-09-24
    • 2014-11-22
    • 2016-07-09
    • 1970-01-01
    相关资源
    最近更新 更多