Apache spark 如何在Spark中的groupby之后运行RDD操作?

Apache spark 如何在Spark中的groupby之后运行RDD操作?,apache-spark,pyspark,bigdata,Apache Spark,Pyspark,Bigdata,我有一大组数据要对其执行集群。关键是,我不希望整个集合都有一个集群,而是每个用户都有一个集群。基本上,我会先做一个GroupByUserID,然后运行KMeans 问题是,一旦执行groupby,任何映射都将在spark控制器上下文之外,因此任何创建RDD的尝试都将失败。mllib中Spark的KMeans库需要一个RDD(因此可以并行化) 我看到了两种解决办法,但我希望有更好的解决办法 1) 手动循环控制器中的所有数千个用户(当事情变大时,可能会有数百万个),并为每个用户运行kmeans 2)

我有一大组数据要对其执行集群。关键是,我不希望整个集合都有一个集群,而是每个用户都有一个集群。基本上,我会先做一个GroupByUserID,然后运行KMeans

问题是,一旦执行groupby,任何映射都将在spark控制器上下文之外,因此任何创建RDD的尝试都将失败。mllib中Spark的KMeans库需要一个RDD(因此可以并行化)

我看到了两种解决办法,但我希望有更好的解决办法

1) 手动循环控制器中的所有数千个用户(当事情变大时,可能会有数百万个),并为每个用户运行kmeans

2) 在控制器中执行groupby,然后在map中运行由外部库提供的非并行kmeans

请告诉我还有另一种方法,我宁愿尽可能地拥有一切。

编辑:我在回复时不知道它是
pyspark
。然而,我将把它作为一个可能被改编的想法

我有一个类似的问题,我能够提高性能,但它仍然不是我理想的解决方案。也许对你来说可以

其想法是将RDD分解成许多更小的RDD(每个用户id都有一个新的RDD),将它们保存到一个数组中,然后为每个“子RDD”调用处理函数(在您的例子中是集群)。建议的代码如下(注释中有解释):

//仅用作示例的case类
案例类MyClass(userId:Long,value:Long,…)
//带有用户ID的Scala本地数组(可以是另一个迭代器,如List或array):
val userList:Seq[Long]=rdd.map{{uu.userId}.distinct.collect.toSeq//只是一个建议!
//现在我们可以创建新的RDD:
val rddsList:Seq[RDD[MyClass]=userList.map{
userId=>rdd.filter({item:MyClass=>item.userId==userId})
}托塞克先生
//最后,我们为每个RDD调用我们想要的函数,将结果保存在一个新列表中。
//注意“.par”调用,它用于同时启动多个RDD的昂贵执行
VAL结果=RDDLISST.PARMAP {
r=>myFunction(r)
}
我知道这与您的第一个选项大致相同,但通过使用
.par
调用,我能够提高性能

此调用将
rddsList
对象转换为一个对象。这个新的Scala对象允许并行计算,因此,理想情况下,map函数将一次调用多个RDD的
myFunction(r)
,这可以提高性能


有关并行集合的更多详细信息,请查看。

用户列表的类型是什么?阵列?我试图找到“PAR”方法列表是一个Scala本地迭代器(数组,列表,Seq,…)HMM,那么PARS API的一部分是什么?它是如何连接到本机Scala类型的?我能在文档中找到的最接近的东西是var rdd=sc.parallelize(数据);这和你在这里说的不一样。你能指出一个关于这个的文档页面吗?我添加了回复的链接。
par
是一种Scala方法,可用于主要的Scala集合。在我的示例中,我将其调用到一个RDD数组,该数组是通过多次过滤主RDD创建的