【问题标题】:Intersection of Two HashMap (HashMap<Integer,HashSet<Integer>>) RDDs in Scala for SparkScala for Spark 中两个 HashMap (HashMap<Integer,HashSet<Integer>>) RDD 的交集
【发布时间】:2017-11-12 07:26:35
【问题描述】:

我在 Scala 中工作,以便在独立机器(装有 Windows 10 的 PC)上使用 Spark 进行编程。我是新手,没有 scala 和 spark 编程经验。因此,我将非常感谢您的帮助。

问题:

我有一个 HashMap,hMap1,它的值是整数条目 (HashMap>) 的 HashSet。然后我将其值(即许多 HashSet 值)存储在 RDD 中。代码如下

val rdd1 = sc.parallelize(Seq(hMap1.values()))

现在我有另一个相同类型的 HashMap,hMap2,即 HashMap>。它的值也存储在 RDD 中

val rdd2 = sc.parallelize(Seq(hMap2.values()))

我想知道如何让 hMap1 和 hMap2 的值相交

例如:

输入:

rdd1 = [2, 3], [1, 109], [88, 17]中的数据

rdd2 = [2, 3], [1, 109], [5,45]中的数据

输出

所以输出 = [2, 3], [1, 109]

【问题讨论】:

    标签: scala apache-spark hashmap intersection hashset


    【解决方案1】:

    问题陈述

    我对你的问题的理解如下:

    给定两个 RDD[Set[Integer]] 类型的 RDD,我如何生成它们共同记录的 RDD

    样本数据

    生成的两个RDD
    val rdd1 = sc.parallelize(Seq(Set(2, 3), Set(1, 109), Set(88, 17)))
    val rdd2 = sc.parallelize(Seq(Set(2, 3), Set(1, 109), Set(5, 45)))
    

    可能的解决方案

    如果我对问题陈述的理解是正确的,您可以使用rdd1.intersection(rdd2) 如果您的 RDD 与我想的一样。这是我在 Spark 2.2.0 的 spark-shell 上尝试的:

    rdd1.intersection(rdd2).collect
    

    产生了输出:

    Array(Set(2, 3), Set(1, 109))
    

    这是因为 Spark 可以比较 Set[Integer] 类型的元素,但请注意,这不适用于任何对象 Set[MyObject],除非您定义了 MyObjectequality contract

    【讨论】:

    • 感谢 Alex 的及时回复,这对您有很大帮助。实际上,我有 2 个类:一个在 Scala 中,另一个在 Java 中。源数据在Java类的HashMap中,key为整数,对应的值为整数的HashSet。因此,当我将值检索到 Scala 中时,我遇到了错误。发现的主要错误是 HashMap 值不是“可序列化”的,因此我无法获得所需的数据。作为解决方案:我将 Java 类的 HashMap 值存储在一个公共静态变量中,然后在 Scala 类中直接调用该变量。
    • 感谢您的更新 - 我不确定我是否理解为什么 Java 的 HashsetInteger 不能被序列化困难?如果您有时间,请随时分享例外情况 - 我只是好奇
    • 嗨,Alex,我很忙,无法及时回复。我将尝试将错误发送给您,直到下周。无论如何,我还有一个问题,如果你能回答我,那也会有很大的帮助。我的问题是stackoverflow.com/questions/47324904/…
    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多