spark java如何通过key处理rdd

时间:2015-05-12 15:37:03

标签: java apache-spark rdd

我刚刚开始使用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()?

提前致谢

0 个答案:

没有答案