2017-07-03 77 views
0

仍然是Scala和Spark的初学者,我认为我只是在这里毫无头脑。我有两个RDDS,类型之一: -如何在两个单独的RDD之间映射键/值对?

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

其他类型的: -

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

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

问题是这样的:

是否有通过我可以以这样的方式,该TID和uid在两者匹配,并且全部为相同的匹配ID的数据被显示在比较这两个RDDS的方法一行没有任何重复?

例如:如果我得到一个匹配两个RDDS

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

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

之间TID和UID的则输出是: -

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

两个RDDS ID是不以任何固定的订购。它们是随机的,即在两个RDD中相同的uid和tid序列号可能不一致。

而且,怎么会当第一RDD型保持不变,但第二RDD变化键入解决方案的变化: -

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

我必须这样做,而无需使用SQL星火的。

回答

2

我建议你将你的rdds转换成dataframes,并将join用于简单。

你的第一个dataframe应该是

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

第二dataframe

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

然后得到最终的输出仅仅是innerjoin作为

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

,这将给输出

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

编辑

如果你想这样做没有数据帧/火花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)时才起作用。 你应该有最终输出

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

+0

为什么接受?你想要没有spark的SQL帮助,不是吗? –

+0

没有冒犯!正式的是。但是非正式地讲,这也教会了我一些新的东西,因为我从来没有单独使用过SQL,或者之前使用过Spark。这就是接受和赞成的原因。 – PixieDev

+0

我认为你可以使用RDD map,mapPartitions和join方法来实现你的目标。 – Tom

相关问题