Scala Spark:如何将不同的组值从RDD写入不同的文件?

Scala Spark:如何将不同的组值从RDD写入不同的文件?,scala,apache-spark,Scala,Apache Spark,我需要将键为1的值写入文件file1.txt,将键为2的值写入file2.txt: val ar = Array (1 -> 1, 1 -> 2, 1 -> 3, 1 -> 4, 1 -> 5, 2 -> 6, 2 -> 7, 2 -> 8, 2 -> 9) val distAr = sc.parallelize(ar) val grk = distAr.groupByKey() 如何做到这一点,而不需要将集合安排两次?我们将不同客户的数据

我需要将键为
1
的值写入文件
file1.txt
,将键为
2
的值写入
file2.txt

val ar = Array (1 -> 1, 1 -> 2, 1 -> 3, 1 -> 4, 1 -> 5, 2 -> 6, 2 -> 7, 2 -> 8, 2 -> 9)
val distAr = sc.parallelize(ar)
val grk = distAr.groupByKey()

如何做到这一点,而不需要将集合安排两次?我们将不同客户的数据写入不同的表,这基本上是相同的用例。我们使用的常见模式如下:

val customers:List[String] = ???

customers.foreach{customer => rdd.filter(record => belongsToCustomer(record,customer)).saveToFoo()}

这可能无法实现“不在rdd上迭代两次(或n次)”的愿望,但过滤器是在并行分布式环境中进行的一种廉价操作,它可以正常工作,因此我认为它确实符合“常规Spark方式”的操作方式。

它本质上是一种串行操作。因此,只需在
ar
上运行
foreach
,并将值写入该键的正确文件。我认为这个问题类似于这个问题。据我所知,这个问题有一个HDFS特定的答案,而不是一般的答案。解决这个问题的“通用火花方法”是什么?这个问题似乎类似于。Spark issue tracker上存在一个未解决的问题,即添加一次通过键将单个RDD写入多个位置的能力:。不幸的是,每个键在RDD上迭代一次并不能很好地扩展。如果我没弄错的话,您可以使用
belongsToCustomer
作为一种“多重过滤器”,决定要编写什么文件。正确吗?不,
filter
接受一个布尔谓词,因此它是一个简单的布尔运算,类似于
record.customer==customer
,但什么是
saveToFoo
?它仅仅是一个普通的Scala函数,将一条记录写入一个文件吗?Spark如何决定创建此文件的节点?在这种情况下如何使用Spark
saveAsTextFile
?在每个循环中,为特定谓词创建一个新的
filteredRDD
。然后,您可以使用该rdd上的操作将其具体化。你可以这样做,例如,
.saveAsTextFile(s“$basePath/$customer/data.txt”)
我不知道。需要认识到的是,
过滤器
比“rdd.splitByKey”要有效得多,因为这样的操作将在洗牌中发生,而“过滤器”将与后面的任何操作对齐。