为什么连接两个数据集并应用过滤器会导致“错误:构造函数无法实例化为预期类型”?

时间:2014-09-11 15:10:08

标签: scala hadoop apache-spark spark-streaming

我正在加入两个数据集 - 第一个来自流,第二个来自HDFS。

我在火花中使用scala。在连接两个数据集之后,我需要对已连接的数据集应用过滤器,但在这里我面临着问题。请协助解决。

我正在使用以下代码,

 val streamkv = streamrecs.map(_.split("~")).map(r => ( r(0), (r(5), r(6)))) 
val HDFSlines = sc.textFile("/user/Rest/sample.dat").map(_.split("~")).map(r => ( r(1), (r(0) r(3),r(4),))) 
val streamwindow = streamkv.window(Minutes(1)) 

val join1 = streamwindow.transform(joinRDD => { joinRDD.join(HDFSlines)} ) 

当我使用过滤器时,我收到以下错误

val tofilter = join1.filter {
     | case (r(0), (r(5), r(6)),(r(0),r(3),r(4))) =>
     | r(4).contains("iPhone")
     | }.count()
<console>:48: error: constructor cannot be instantiated to expected type;
found   : (T1, T2, T3)
required: (String, ((String, String), (String, String, String)))
       case (r(0), (r(5), r(6)),(r(0),r(3),r(4))) =>

2 个答案:

答案 0 :(得分:0)

在scala(类型语言FYI)中,模式匹配( case )允许在块中提取&#39; 变量用于本地用法。因此

case (r(0), (r(5), r(6)),(r(0),r(3),r(4))) =>

是非法的,因为你不在这里调用r函数,而是提取值(想想函数声明)。

假设结果流/集合join1中的对象遵循此类型签名(_, (_, _), (_, _, String)),您应该尝试:

val tofilter = join1.filter {
 | case (_, (_, _),(_,_,device)) =>
 | device.contains("iPhone")
 | }.count()

答案 1 :(得分:0)

错误的原因是缺少一对圆括号。

case (r(0), (r(5), r(6)),(r(0),r(3),r(4)))的行应该是case (_, ((_, _),(_,_,device))) => - 请注意最后两个元素的括号 - Tuple2Tuple3个对象。