Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Spark中将HashMap转换为JavaPairRDD?_Java_Apache Spark - Fatal编程技术网

如何在Spark中将HashMap转换为JavaPairRDD?

如何在Spark中将HashMap转换为JavaPairRDD?,java,apache-spark,Java,Apache Spark,我对Apache Spark很陌生。我正在尝试从HashMap创建javapairdd。我有一个类型为 如何将其转换为javapairdd?我已将代码粘贴到下面: HashMap<String, HashMap<Integer,String>> canlist = new HashMap<String, HashMap<Integer,String>>(); for (String key : entityKey) { HashM

我对Apache Spark很陌生。我正在尝试从
HashMap
创建
javapairdd
。我有一个类型为
如何将其转换为
javapairdd
?我已将代码粘贴到下面:

HashMap<String, HashMap<Integer,String>> canlist =
    new HashMap<String, HashMap<Integer,String>>();

for (String key : entityKey)
{
    HashMap<Integer, String> clkey = new HashMap<Integer, String>();
    int f=0;
    for (String val :mentionKey)
    {
        //do something
        simiscore = (longerLength - costs[m.length()]) / (double) longerLength;

        if (simiscore > 0.6) {
            clkey.put(v1,val);
            System.out.print(
                " The mention  " + val + " added to link entity  " + key);
            }
            f++;
            System.out.println("Scan Completed");
    }
    canlist.put(key,clkey);
    JavaPairRDD<String, HashMap<Integer, String>> rad;
    rad = context.parallelize(scala.collection.Seq(toScalaMap(canlist)));

}
public static <String,Object> Map<String,Object> toScalaMap(HashMap<String,Object> m) {
    return (Map<String,Object>) JavaConverters.mapAsScalaMapConverter(m).asScala().toMap(
            Predef.<Tuple2<String,Object>>conforms()
    );}
}
HashMap canlist=
新的HashMap();
for(字符串键:entityKey)
{
HashMap clkey=newhashmap();
int f=0;
for(字符串val:key)
{
//做点什么
simiscore=(longerLength-成本[m.length()])/(双倍)longerLength;
如果(分数>0.6){
clkey.put(v1,val);
系统输出(
“链接实体“+键”中添加的提及“+val+”;
}
f++;
System.out.println(“扫描完成”);
}
canlist.put(key,clkey);
javapairdd-rad;
rad=context.parallelize(scala.collection.Seq(toScalaMap(canlist));
}
公共静态映射到calamap(HashMap m){
return(Map)JavaConverters.mapascalamapconverter(m.asScala().toMap(
Predef.conforms()
);}
}

如果将
HashMap
转换为
列表
,则可以使用。

下面是将java
HashMap
转换为
列表
并传递到JavaSparkContext的parallelizePairs()方法的另一种方法

import scala.Tuple2;

List<Tuple2<String, HashMap<Integer,String>>> list = new ArrayList<Tuple2<String, HashMap<Integer,String>>>();      
for(Map.Entry<String, HashMap<Integer,String>> entry : canlist.entrySet()){
    list1.add(new Tuple2<String, HashMap<Integer,String>>(entry.getKey(),entry.getValue()));
  }

JavaPairRDD<String, HashMap<Integer, String>> javaPairRdd = jsc.parallelizePairs(list);
导入scala.Tuple2;
列表=新的ArrayList();
对于(Map.Entry:canlist.entrySet()){
添加(新的Tuple2(entry.getKey(),entry.getValue());
}
javapairdd javapairdd=jsc.parallelizePairs(列表);

转换通用方法的代码片段。利用
JavaSparkContext.parallelizePairs()
和此方法的结果

    //fromMapToListTuple2() generic method to convert Map<T1, T2> to List<Tuple2<T1, T2>>
    public static <T1, T2> List<Tuple2<T1, T2>> fromMapToListTuple2(Map<T1, T2> map)
    {
        //list of tuples
        List<Tuple2<T1, T2>> list = new ArrayList<Tuple2<T1, T2>>();

        //loop through all key-value pairs add them to the list
        for(T1 key : map.keySet())
        {
            //get the value
            T2 value = map.get(key);

            //Tuple2 is not like a traditional Java collection, but a single k-v pair;
            Tuple2<T1, T2> tuple2 = new Tuple2<T1, T2>(key, value);

            //populate the list with created tupple2
            list.add(tuple2);
        } // for

        return list;
    } // fromMapToListTuple2
//fromMapToListUple2()将映射转换为列表的通用方法
从映射到列表2的公共静态列表(映射)
{
//元组列表
列表=新的ArrayList();
//循环遍历所有键值对,将它们添加到列表中
for(T1键:map.keySet())
{
//获取值
T2值=map.get(键);
//Tuple2不像传统的Java集合,而是一个k-v对;
Tuple2 Tuple2=新的Tuple2(键,值);
//使用创建的tuple2填充列表
list.add(tuple2);
}//为了
退货清单;
}//frommaptolistuple2

如果您提供预期的输出,这将非常有用。我看到了至少两个可能的选项:
javapairdd
javapairdd
预期输出的格式为javapairdd,用于转换为Scala映射,然后调用
toSeq
应该可以。有什么方法可以纯用Java实现吗?据我所知,
parallelize
需要
scala.collection.Seq
作为参数。很抱歉,我没有完整的示例。我不通过Java使用Spark。如果你有选择的话,你最好使用Scala!这起作用了。尽管我不得不将HashMap更改为ListCool!我在回答中加了一条关于这一点的注释。我不知道如何在Java中进行实际转换。也许您可以将代码添加到答案中-听起来它对本页的未来读者很有用。