我是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个:
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|
+---+---+
答案 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;
做