将JavaPairRDD转换为JavaRDD

时间:2015-10-08 09:41:40

标签: java elasticsearch apache-spark rdd apache-spark-mllib

我使用ElasticSearch-Hadoop Library从ElsticSearch获取数据。

JavaPairRDD<String, Map<String, Object>> esRDD = JavaEsSpark.esRDD(sc);

现在我有了JavaPairRDD。我想在这个RDD上使用来自MLLib的Random Forest。 所以我将它转换为JavaPairRDD.toRDD(esRDD)这将给我RDD。 使用RDD我再次转换为JavaRDD

JavaRDD<LabeledPoint>[] splits = (JavaRDD.fromRDD(JavaPairRDD.toRDD(esRDD),
            esRDD.classTag())).randomSplit(new double[] { 0.5, 0.5 });

JavaRDD<LabeledPoint> trainingData = splits[0];
JavaRDD<LabeledPoint> testData = splits[1];

我想将trainingData和TestData传递给Random Forest算法,但它在编译时给出了转换异常。

  
    

类型不匹配:无法转换     JavaRDD [Tuple2 [String,Map [String,Object]]] []到     JavaRDD [LabeledPoint] []

  

添加方括号,小于和大于符号不起作用

任何人都可以建议我使用Casting的正确方法。我是Spark Datastrucutres的新手。

1 个答案:

答案 0 :(得分:7)

您在JavaPairRDD列中有哪些数据? JavaPairRDD是第一列和第二列之间的键/值映射,与普通RDD不同。

您可能希望从JavaPairRDD中删除第一列,仅使用值列返回JavaRDD。

为此,只需运行类似:

JavaRDD newRDD = esRDD.map(x =&gt; x._2);

或等效创建没有第一列的新JavaRDD。