val result1 = rdd.map(x=> {
 val data = x.split(",")
 val date = data(0)
 val vid = data(11)
 val duration = data(16)
 (date, vid, duration)
 }).filter(t => t._1!=null).filter(t => t._2!=null).filter(t => t._3!=null).take(10)请问我想筛选出三元素都不为空的三元组怎么写啊,我这样写达不到目的。求大婶帮忙

解决方案 »

  1.   

    filter 筛选适合 key-value这样的rdd
    你可以 这样val result1 = rdd.map(x=> {
     val data = x.split(",")
     val date = data(0)
     val vid = data(11)
     val duration = data(16)
    val key = date
    val value = vid+","+duration 
     (key,value)
     }).filter(t => t._1!=null).filter(t => (t._2.split(","))(0)!=null).filter(t => (t._2.split(","))(1)!=null).take(10)
      

  2.   

    val result1 = rdd.map(x=> {
          val data = x.split(",")
          val date = data(0)
          val vid = data(11)
          val duration = data(16)
          (date, vid, duration)
        }).filter(rdd=>{
          if(rdd._1!=null && rdd._2!=null && rdd._3!=null)
            {
              true
            }else
          {
            false
          }
          
        }).take(10)
    可以这样试试
      

  3.   

    val result1 = rdd.map(x=> {
     val data = x.split(",")
     val date = data(0)
     val vid = data(11)
     val duration = data(16)
     (date, vid, duration)
     }).filter(t => t._1!=null&&t._2!=null &&t._3!=null).take(10)
      

  4.   

    建议借助第三方的工具类,这里推荐糊涂工具类:https://hutool.cn/docs/#/
    val result1 = rdd.map(x=> {
     val data = x.split(",")
     val date = data(0)
     val vid = data(11)
     val duration = data(16)
     (date, vid, duration)
     }).filter(tp => StrUtil.isNotBlack(tp._1) && StrUtil.isNotBlack(tp._2) && StrUtil.isNotBlack(tp._3)).take(10)
      

  5.   

    val result1 = rdd.map(x=> {
     val data = x.split(",")
     val date = data(0)
     val vid = data(11)
     val duration = data(16)
     (date, vid, duration)
     }).filter(t => t._1!=null&&t._2!=null&&t._3!=null)
      

  6.   

    第二行:val data = x.split(",")
    说明 data 类型 Array[String]
    通过split得到的data里面是不可能包含null的,最多只能是   ""   空字符串
    所以,想通过   xxx != null 来过滤是无论如何都不可能过滤任何一条数据的,哪怕是空字符串,也是 != null 的.filter(t => t._1!=null).filter(t => t._2!=null).filter(t => t._3!=null)
    if(rdd._1!=null && rdd._2!=null && rdd._3!=null)
    这两种方式无论怎么改,表达式结果均为true,所有数据都是会保留的。
      

  7.   

    filter(t => t._1!=null&&t._2!=null &&t._3!=null).take(10)
    你原先的逻辑错误了,这个可行
      

  8.   

    在spark里不要和null, 特别是 split(",") 出来的值是没有null的, 
    什么也不说, 看代码 : def test23(): Unit ={
        val cfg =new Configuration()
        val conf = new SparkConf()
          .setAppName("spack 本地测试")
          .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
          .setMaster("local") // 本地调试
        val sc = new SparkContext(conf)
        
        //接你的代码, 判断有没有值用 nonEmpty, 或者 isEmpty
        val rdd = sc.makeRDD(Array( "a,a,a", "b,b,b", "c,,c", "d,d,d" ), 3)
        val result1 = rdd.map(x => {
          val data = x.split(",")
          val date = data(0)
          val vid = data(1)
          val duration = data(2)
          (date, vid, duration)
        } )
          .filter(t => t._1.nonEmpty && t._2.nonEmpty && t._3.nonEmpty)
          .take(10)
          .foreach(row => println(row))
      }
      

  9.   

    结果: 
    (a,a,a)
    (b,b,b)
    (d,d,d)有空的已去掉.
      

  10.   


    见上面, 不是这样用的, 你这个是java的写法(容易混)