如何在两个单独的RDD之间映射键/值对?

时间:2017-07-03 05:08:07

标签: scala apache-spark string-matching

仍然是Scala和Spark的初学者,我想我只是在这里没脑子。我有两个RDD,其中一种类型: -

((String, String), Int) = ((" v67430612_serv78i"," fb_201906266952256"),1)

其他类型: -

(String, String, String) = (r316079113_serv60i,fb_100007609418328,-795000)

可以看出,两个RDD的前两列具有相同的格式。基本上他们是ID,一个是'tid',另一个是'uid'。

问题是:

有没有一种方法可以比较两个RDD,使tid和uid在两者中都匹配,同一匹配id的所有数据都显示在一行而不重复?

例如:如果我在两个RDD之间得到tid和uid的匹配

((String, String), Int) = ((" v67430612_serv78i"," fb_201906266952256"),1)

(String, String, String) = (" v67430612_serv78i"," fb_201906266952256",-795000)

然后输出为: -

((" v67430612_serv78i"," fb_201906266952256",-795000),1)

两个RDD中的ID没有任何固定顺序。它们是随机的,即相同的uid和tid序列号可能在两个RDD中都不对应。

此外,如果第一个RDD类型保持不变但第二个RDD更改为类型,解决方案将如何更改: -

((String, String, String), Int) = ((daily_reward_android_5.76,fb_193055751144610,81000),1)

我必须在不使用Spark SQL的情况下执行此操作。

1 个答案:

答案 0 :(得分:2)

我建议您将rdds转换为dataframes并申请join以方便。

您的第一个dataframe应该是

+------------------+-------------------+-----+
|tid               |uid                |count|
+------------------+-------------------+-----+
| v67430612_serv78i| fb_201906266952256|1    |
+------------------+-------------------+-----+

第二个dataframe应为

+------------------+-------------------+-------+
|tid               |uid                |amount |
+------------------+-------------------+-------+
| v67430612_serv78i| fb_201906266952256|-795000|
+------------------+-------------------+-------+

然后获得最终结果仅为inner join

df2.join(df1, Seq("tid", "uid"))

将输出

+------------------+-------------------+-------+-----+
|tid               |uid                |amount |count|
+------------------+-------------------+-------+-----+
| v67430612_serv78i| fb_201906266952256|-795000|1    |
+------------------+-------------------+-------+-----+

<强>被修改

如果你想在没有dataframe / spark sql的情况下这样做,那么也有以rdd方式加入,但你必须修改如下

rdd2.map(x => ((x._1, x._2), x._3)).join(rdd1).map(y => ((y._1._1, y._1._2, y._2._1), y._2._2)) 

只有在您的问题中分别定义rdd1rdd2 ((" v67430612_serv78i"," fb_201906266952256"),1)(" v67430612_serv78i"," fb_201906266952256",-795000)时,此功能才有效。 你应该有最终输出

(( v67430612_serv78i, fb_201906266952256,-795000),1)

确保修剪空格的值。这将帮助您确保两个rdd在加入时具有相同的键值,否则您可能会得到一个空结果。