【问题标题】:scala, filter RDDscala,过滤RDD
【发布时间】:2019-06-04 18:06:32
【问题描述】:

我有验证:

val key: RDD[String]= Seq("0000005","0000001","0000007").toRDD

val file2: Array[String] = Array(("0000005", 82, 79, 16, 21, 80), ("0000001", 46, 39, 8, 5, 21), ("0000004", 58, 71, 20, 10, 6), ("0000009", 60, 89 33 18 6), ("0000003", 30, 50, 71, 36, 30), ("0000007", 50, 2, 33, 15, 62))

我想在 file2 中过滤“key”中存在的元素

我想要这样的东西:

0000005 82 79 16 21 80 0000001 46 39 8 5 21 0000007 50 2 33 15 62

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    我将其简化为标准 Scala 集合类型:

    val keys = Seq("0000005","0000001","0000007")
    
    val all = Seq("0000005 82 79 16 21 80",
    "0000001 46 39 8 5 21", 
    "0000004 58 71 20 10 6",
    "0000009 60 89 33 18 6",
    "0000003 30 50 71 36 30",
    "0000007 50 2 33 15 62")
    

    这里是过滤器功能,会给你resuklt:

    val filtered = all.map(_.split(" ").toList)
                      .filter{ case x::_ => keys.contains(x) }
                      .map(_.mkString(" "))
    
    println(filtered) // -> List(0000005 82 79 16 21 80, 0000001 46 39 8 5 21, 0000007 50 2 33 15 62)
    

    Scalafiddle

    【讨论】:

    • 如果文件足够小,可以转成Array,可以使用这个方案。但是,如果 OP 想要使用 RDDs keys.contains(x) 将无法正常工作。
    • 此答案使用 Seq (List) contains 方法,该方法进行线性查找。此解决方案无法很好地扩展
    【解决方案2】:

    首先,需要为key->value结构映射file2:(我假设file2中的所有数字实际上都是字符串..):

    val file2Map: RDD[(String, Array[String])] = file2.map(value => (value.head, value)).toRDD
    

    现在,如果您这样做: keys.join(file2Map).take(10).foreach(println)

    输出会是这样的:

    (0000005, (0000005, 0000005 82 79 16 21 80)
    (0000001, (0000001, 0000001 46 39 8 5 21)
    (0000007, (0000001, 0000001 50 2 33 15 62)
    

    从中很容易只从值中获取第二个元组。

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2015-10-26
      相关资源
      最近更新 更多