gpt4 book ai didi

scala - 通过键Spark写入多个输出-一个Spark作业

转载 作者:行者123 更新时间:2023-12-02 21:18:23 25 4
gpt4 key购买 nike

如何在单个Job中使用Spark如何根据键写入多个输出。

相关:Write to multiple outputs by key Scalding Hadoop, one MapReduce Job

例如。

sc.makeRDD(Seq((1, "a"), (1, "b"), (2, "c")))
.writeAsMultiple(prefix, compressionCodecOption)

将确保 cat prefix/1
a
b

cat prefix/2将是
c

编辑:我最近添加了一个新的答案,其中包括完整的导入,pimp和压缩编解码器,请参阅 https://stackoverflow.com/a/46118044/1586965,它除了早期的答案外可能还会有所帮助。

最佳答案

如果使用Spark 1.4+,由于有了DataFrame API,这变得非常容易。 (DataFrames是在Spark 1.3中引入的,但是我们需要的partitionBy()introduced in 1.4。)

如果从RDD开始,则首先需要将其转换为DataFrame:

val people_rdd = sc.parallelize(Seq((1, "alice"), (1, "bob"), (2, "charlie")))
val people_df = people_rdd.toDF("number", "name")

在Python中,相同的代码是:
people_rdd = sc.parallelize([(1, "alice"), (1, "bob"), (2, "charlie")])
people_df = people_rdd.toDF(["number", "name"])

一旦有了DataFrame,就可以根据特定键写入多个输出,这很简单。更重要的是-这就是DataFrame API的优点-Python,Scala,Java和R中的代码几乎相同:
people_df.write.partitionBy("number").text("people")

如果需要,您可以轻松使用其他输出格式:
people_df.write.partitionBy("number").json("people-json")
people_df.write.partitionBy("number").parquet("people-parquet")

在以上每个示例中,Spark将为我们对DataFrame进行分区的每个键创建一个子目录:
people/
_SUCCESS
number=1/
part-abcd
part-efgh
number=2/
part-abcd
part-efgh

关于scala - 通过键Spark写入多个输出-一个Spark作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38126668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com