将 Scala 的 K-means 应用于 rdd 的每个元素。

Posted

技术标签:

【中文标题】将 Scala 的 K-means 应用于 rdd 的每个元素。【英文标题】:Apply K-means for Scala to each element of rdd. 【发布时间】:2016-06-24 20:31:07 【问题描述】:

我在 spark scala 中有一个很大的 rdd,其中每个元素都是数组中的数组。

val rdd = sc.parallelize[array1[array1_1[], array1_2[], ....array1_24]], .... , array240[array240_1[], array240_2[], ....array240_24]]

所有元素都是不同的,我应该对每个元素应用 k-means 算法。

但是,Spark 中的 k-means 仅适用于 RDD,而不适用于数组。

所以,我接下来做

for (i <= 0 to 240) 

    val rdd = sc.parallelize[array1[array1_1[], array1_2[], ....array1_24]]]

但是太慢了……

我有来自 5 个大节点的集群,它们可以做更多...

如何在没有 for 循环的情况下解决我的问题?

【问题讨论】:

【参考方案1】:

您的设计似乎存在严重问题。

如果每个数组都足够小,可以在单个分区上进行本地有效处理,那么使用 Spark MLlib 将无济于事。只需使用您最喜欢的非分布式机器学习库来单独训练每个项目的 K-means。对于大型集群和小型数据,Spark 将花费大部分时间来传递消息。

如果不是这种情况,那么使用数组来存储这样的数据是没有意义的。每个样本都应该是一个单独的 RDD,或者这些可以组合但用标签展平。

根据您的描述,这是第一种情况。如果您出于所有原因想要使用 MLLib,那么请尝试显着降低每个 RDD 的并行度,并根据调度程序单独构建您的作业来完成其余的工作。

【讨论】:

我只能强调运行k-means是便宜,你根本不需要分布式计算; ELKI 等工具具有非常快速的 k-means 实现,并且可能会快得多只要数据适合主内存

以上是关于将 Scala 的 K-means 应用于 rdd 的每个元素。的主要内容,如果未能解决你的问题,请参考以下文章

如何将 RDD[Row] 转换为 RDD[Vector]

如何将 RDD [ Vector ] 中的合成控制数据集转换为 K-Means 算法

将 Pyspark Python k-means 模型预测插入具有原始 RDD 项和特征的 DF

将每个 RDD 值与 Scala 中 RDD 中的所有其他值配对

Spark:scala - 如何将集合从 RDD 转换为另一个 RDD

Scala - 将 RDD[String] 转换为地图