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

Scala Spark Rdd按字段名处理每行的不同字段,scala,apache-spark,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=> { i

我不熟悉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个:

  • 第二个映射“x.getAs”是一个错误语法
  • 如何导入新的
    rdd
  • 我在网上搜索了很长时间。但是没有用。请帮助或尝试给出一些如何实现这一点的想法


    谢谢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|
    +---+---+
    
    def randomString(len:Int):字符串={
    val rand=new scala.util.Random(System.nanoTime)
    val sb=新的StringBuilder(len)
    val ab=“0123456789abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz”
    对于(i)(字符串(2))
    val df=sqlContext.createDataFrame(Seq((1,“Android”),(2,“iPhone”))
    df.带列(“_2”,testUdf(df(“_2”))
    +---+---+
    | _1| _2|
    +---+---+
    |1 | F3|
    |2 | Ag|
    +---+---+
    
    如果您打算过滤某些字段“XXX1”或“XXX2”,则简单的
    选择
    函数应该可以实现这一功能

    df.select("XXX1", "XXX2")
    
    并将其转换为
    rdd

    如果您打算做其他事情,那么您的
    x.getAs
    应该如下所示

     val random1 = x.getAs(y.name)
    
    似乎您正在尝试更改某些列“XXX1”和“XXX2”中的值
    为此,一个简单的
    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")))
    

    同样地,您也可以为“XXX2”做些什么

    谢谢您的快速回复,但我想得到一个新的RDD,它改变了特殊的奇数RDD字段,而其他字段保持不变。是的,我也认为“udf”。但在我的情况下,每个特殊字段都是不同的。withColumn将为一个特殊字段提供相同的结果。
    withColumn
    将给出所使用的
    udf函数
    返回的结果。因此,您可以
    udf
    中的不同字段匹配案例
    ,以获得不同的值。@Tamesh Maharjan-抱歉稍后,它会很好地工作,非常感谢。我的荣幸@meng。顺便说一下,你把我的名字弄错了。:)如果答案对你有用的话,投票也会对我有帮助:)