Spark Rdd按字段名称处理每行的不同字段

时间:2017-05-17 01:52:21

标签: scala apache-spark

我是Spark和Scala的新手,现在我遇到了一个问题:如何按字段名称处理每一行的不同字段,然后再处理新的rdd

这是我的伪代码:

val newRdd = df.rdd.map(x=>{
        def Random1 => random(1,10000)  //pseudo
        def Random2 => random(10000,20000)  //pseduo
        x.schema.map(y=> {
          if (y.name == "XXX1")
            x.getAs[y.dataType](y.name)) = Random1
          else if (y.name == "XXX2")
            x.getAs[y.dataType](y.name)) = Random2
          else 
            x.getAs[y.dataType](y.name))  //pseduo,keeper the same
        })
      })

上面的错误少了2个:

  1. 第二张地图," x.getAs"是一种错误语法
  2. 如何进入新的rdd
  3. 我在网上搜索了很长时间。但没用。请帮助或尝试提供一些如何实现这一目标的想法。

    感谢Ramesh Maharjan,它现在有效。

    def randomString(len: Int): String = {
        val rand = new scala.util.Random(System.nanoTime)
        val sb = new StringBuilder(len)
        val ab = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
        for (i <- 0 until len) {
          sb.append(ab(rand.nextInt(ab.length)))
        }
        sb.toString
      }
     def testUdf = udf((value: String) =>randomString(2))
     val df = sqlContext.createDataFrame(Seq((1,"Android"), (2, "iPhone")))
     df.withColumn("_2", testUdf(df("_2")))
    +---+---+
    | _1| _2|
    +---+---+
    |  1| F3|
    |  2| Ag|
    +---+---+
    

1 个答案:

答案 0 :(得分:1)

如果您打算过滤某些字谜&#34; XXX1&#34; &#34; XXX2&#34;然后简单的select函数应该做的伎俩

df.select("XXX1", "XXX2")

并将其转换为rdd
如果您打算使用其他内容,则x.getAs应如下所示

 val random1 = x.getAs(y.name)

您似乎正在尝试更改某些列中的值&#34; XXX1&#34;和&#34; XXX2&#34;
为此,一个简单的udf函数和withColumn应该可以解决问题 简单的udf功能如下

  def testUdf = udf((value: String) => {
    //do your logics here and what you return from here would be reflected in the value you passed from the column
  })

你可以将udf函数称为

df.withColumn("XXX1", testUdf(df("XXX1")))

同样,你可以为&#34; XXX2&#34;