我刚刚开始使用Hadoop和Spark。我遇到了我认为是一个简单的问题,但我似乎无法确定最好的前进方向!我使用的是Spark 1.2.1,因为这是我们正在使用的Hortonworks目前支持的内容。 我在Hive中有数据,我正在使用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文件创建的,数据类型在方括号中: 演员[字符串],键[字符串],X [INT],Y [INT] &#39;键&#39;是我想要分组的值,x和y是我们希望聚类的数值。
有更好的方法吗?避免使用for循环和groupsByKey.keys()。collect()?
提前致谢