spark java如何按键处理rdd

spark java如何按键处理rdd,java,apache-spark,rdd,Java,Apache Spark,Rdd,我刚刚开始使用Hadoop和Spark。我遇到了一个我认为很简单的问题,但我似乎无法确定前进的最佳方式!我正在使用Spark 1.2.1,因为这是我们正在使用的Hortonworks当前支持的。 我用mlib KMeans集群算法实现分析蜂巢中的数据 我的数据自然是按键分组的,我正在按此键进行聚类分析。 对于Kmeans,我需要一个按键的数据点JavaRDD 我的问题是,我创建这个数据点JavaRDD的唯一方法是在JavaSchemaRDD中对我的源数据执行mapToPair和GroupByKe

我刚刚开始使用Hadoop和Spark。我遇到了一个我认为很简单的问题,但我似乎无法确定前进的最佳方式!我正在使用Spark 1.2.1,因为这是我们正在使用的Hortonworks当前支持的。 我用mlib KMeans集群算法实现分析蜂巢中的数据

我的数据自然是按键分组的,我正在按此键进行聚类分析。 对于Kmeans,我需要一个按键的数据点JavaRDD

我的问题是,我创建这个数据点JavaRDD的唯一方法是在JavaSchemaRDD中对我的源数据执行mapToPair和GroupByKey,然后循环键,尽管我认为这不是最佳方法。 我想我需要的是一种处理数据并按键创建数据点JavaRDD的方法

示例代码段:

// get the source data to cluster out of the database:
JavaSchemaRDD sqlData = sqlContext.sql("SELECT * FROM "+sourceDBName+"."+sourceTableName);

// grouped by key:
JavaPairRDD<String, Iterable<Row>> groupedByKey = sqlData.mapToPair(new PairByKey()).groupByKey();

// Loop over all keys:
for (String key : groupedByKey.keys().collect())
{
    // Filter for this Key:
    JavaSchemaRDD keyData = sqlData.filter(new FilterByKey(key));

    // Duration vs Score for this TP:
    JavaRDD<Vector> lengthVsScore = keyData.map(new GetLengthVsScore());
    lengthVsScore.cache();

    // Cluster the data into two classes using KMeans
    KMeansModel clusters = KMeans.train(lengthVsScore.rdd(), 2, 20);
}
hadoop表是使用具有四列的CSV文件创建的,数据类型在方括号中: 参与者[STRING],键[STRING],x[INT],y[INT] “key”是我想要分组的值,x和y是我们希望分组的数值

有更好的方法吗?避免for循环和groupedByKey.keys.collect


提前感谢

查看地图功能。我不熟悉Java中的这类问题,但这类问题正是我开始使用Scala的原因。您能否澄清一下sqlData中的行格式是什么?也许PairByKey函数的实现也会有所帮助。嗨,vanekjar,我已经更新了帖子,提供了关于行格式的信息。我将尝试在我的代码片段中使用JavaPairdd上的map函数,groupedByTP,但函数的调用方法接收K中每个键的完整数据集的iterable,这似乎很奇怪,V对。这是仍然分布的,还是需要在一个节点的内存中容纳完整的值集合才能工作?只是看起来它不是RDD。。。我想我需要将它转换回用于mllib.clustering.KMeans实现的RDD。