请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

黑名单过滤疑问

黑名单:
(zs,true)
(ls,true)
日志格式:
20180808,zs
20180808,ls
20180808,ww
通过transform算子,使用leftOuterJoin联表:
val clicklog1 = lines.map(x => (x.split(",")(1),x)).transform(rdd => {rdd.leftOuterJoin(blacksRDD)})
clicklog1.print()
运行后的输出结果
(zs,(20180808,zs,Some(true)))
(ls,(20180808,ls,Some(true)))
(ww,(20180808,ww,None))
使用filter进行过滤:
filter(x => x._2._2.getOrElse(false) != true)
疑问:
第一个_2代表的是?
我的理解:通过leftOuterJoin后,输出的是一个2元组,_2是代表从左向右第2个值,还是代表从左向右下标为2的元素;
第二个_2代表的是?
我的理解:假定第一个_2是从左向右的第2个值,那取出的结果是(20180808,ls,Some(true)),是一个3元组;那么第2个_2取出的结果应该为ls,并不是true或者false呀
求老师解惑~

正在回答 回答被采纳积分+3

1回答

Michael_PK 2018-09-18 19:23:34

_1或者_2 是scala里面的数据结构tuple。

clicklog1的结果的数据结构应该是(String, (String, Option[Boolean])),而不是你描述的那个。


最简单的方式clicklog1.filter(x=>x) 就这么写,你鼠标放到x上就能看到它完整的数据结构了




0 回复 有任何疑惑可以回复我~
  • 提问者 慕圣8049820 #1
    这是老师的原代码:
    val clicklog = lines.map(x => (x.split(",")(1),x)).transform(rdd => {
     rdd.leftOuterJoin(blacksRDD).filter(x => x._2._2.getOrElse(false) != true).map(x=>x._2._1)
    })
    
    我截取出了部分,就是想看下输出结果:
    
    val clicklog = ​lines.map(x => (x.split(",")(1),x)).transform(rdd => {rdd.leftOuterJoin(blacksRDD)})
    clicklog.print()
    发现输出结果为:
    (zs,(20180808,zs,Some(true)))
    (ls,(20180808,ls,Some(true)))
    (ww,(20180808,ww,None))
    
    理论上输出的结果应该为(String, (String, Option[Boolean]))
    所以才对x._2._2过滤出的结果表示疑问;
    但是运行下来,过滤的结果也是正确的
    回复 有任何疑惑可以回复我~ 2018-09-18 19:42:08
  • Michael_PK 回复 提问者 慕圣8049820 #2
    那就是打印的不太对,你直接一个debug进去就知道了
    回复 有任何疑惑可以回复我~ 2018-09-18 20:07:22

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信