代码之家  ›  专栏  ›  技术社区  ›  Ged

拆分RDD的字符串,并在一条语句中与其他RDD元素组合

  •  0
  • Ged  · 技术社区  · 7 年前

    我可以平面映射RDD的第二个元素,很好。

    val rdd = sc.parallelize( Seq( (1, "Hello how are you"),
                                   (1, "I am fine"),
                                   (2, "Yes you are")
                                 )
                            )
    val rdd2 = rdd.flatMap(x => x._2.split(" "))
    

    但是,我想立即将x._1附加到x._2的每个分割项,以形成一个元组(String,Int)。由于某些原因,我看不到它-我不想转换为DF数组并爆炸。有什么想法吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   hage    7 年前

    只需迭代数组(拆分结果)并附加所需的值:

    val rdd = sc.parallelize( Seq( (1, "Hello how are you"),
                                   (1, "I am fine"),
                                   (2, "Yes you are")
                                 )
                            )
    val rdd2 = rdd.flatMap(x => x._2.split(" ").map(item => s"${item}+${x._1}"))
    
        2
  •  1
  •   stack0114106    7 年前

    在df()抽象中也可以得到相同的结果。看看这个

      val df = Seq( (1, "Hello how are you"),(1, "I am fine"),(2, "Yes you are")).toDF("a","b")
      df.show(false)
      df.flatMap( r => { val y = r.getString(1).split(" ");  ( 0 until y.size).map( i => (r.getInt(0), y(i))) }).show
    

    结果:

    +---+-----------------+
    |a  |b                |
    +---+-----------------+
    |1  |Hello how are you|
    |1  |I am fine        |
    |2  |Yes you are      |
    +---+-----------------+
    
    +---+-----+
    | _1|   _2|
    +---+-----+
    |  1|Hello|
    |  1|  how|
    |  1|  are|
    |  1|  you|
    |  1|    I|
    |  1|   am|
    |  1| fine|
    |  2|  Yes|
    |  2|  you|
    |  2|  are|
    +---+-----+
    
    推荐文章