仍然是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的情况下执行此操作。
答案 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))
只有在您的问题中分别定义rdd1
和rdd2
((" v67430612_serv78i"," fb_201906266952256"),1)
和(" v67430612_serv78i"," fb_201906266952256",-795000)
时,此功能才有效。
你应该有最终输出
(( v67430612_serv78i, fb_201906266952256,-795000),1)
确保修剪空格的值。这将帮助您确保两个rdd在加入时具有相同的键值,否则您可能会得到一个空结果。