2017-07-07 38 views
1

我有一個數據幀包含兩列,一個是數據,另一列是 在該數據字段中的字符數。在scala中傳遞兩列到udf?

Data Count 
Hello 5 
How  3 
World 5 

我想根據count列中的值更改列數據的值。這怎麼能實現?我試過這個使用udf:

invalidrecords.withColumn("value",appendDelimiterError(invalidrecords("value"),invalidrecords("a_cnt"))) 

這似乎失敗了,這是正確的方法嗎?

+0

是的,它似乎 –

+0

你需要確保你的UDF是類型的函數'是正確的方式(String,Int)=> String',例如。 –

+0

只有你的列名是不同的 –

回答

3

這裏做

首先創建一個dataframe

import sqlContext.implicits._ 
val invalidrecords = Seq(
    ("Hello", 5), 
    ("How", 3), 
    ("World", 5) 
).toDF("Data", "Count") 

的一個簡單的方法,你應該有

+-----+-----+ 
|Data |Count| 
+-----+-----+ 
|Hello|5 | 
|How |3 | 
|World|5 | 
+-----+-----+ 

然後定義UDF功能

import org.apache.spark.sql.functions._ 
def appendDelimiterError = udf((data: String, count: Int) => "value with error") 

你呼叫使用withColumn作爲

invalidrecords.withColumn("value",appendDelimiterError(invalidrecords("Data"),invalidrecords("Count"))).show(false) 

你應該有輸出

+-----+-----+----------------+ 
|Data |Count|value   | 
+-----+-----+----------------+ 
|Hello|5 |value with error| 
|How |3 |value with error| 
|World|5 |value with error| 
+-----+-----+----------------+ 

您可以從udf功能

編輯寫你的邏輯,而不是返回一個字符串的

在下面的評論中回答您的要求將是必需的Ë您更改UDF功能和withColumn如下

def appendDelimiterError = udf((data: String, count: Int) => { 
    if(count < 5) s"convert value to ${data} - error" 
    else data 
}) 

invalidrecords.withColumn("Data",appendDelimiterError(invalidrecords("Data"),invalidrecords("Count"))).show(false) 

你應該有輸出

+----------------------------+-----+ 
|Data      |Count| 
+----------------------------+-----+ 
|Hello      |5 | 
|convert value to How - error|3 | 
|World      |5 | 
+----------------------------+-----+ 
+0

我想改變數據列本身的值,如果計數小於預期在列數據中附加錯誤值。例如。將第2行的值轉換成如何 - 錯誤 –

+0

請檢查我的更新回答:)我正在使用5按預期計數 –

+0

仍然給我一個錯誤'線程中的異常「main」java.lang.ClassCastException:DelimitedFileProcessTesting $$ anonfun $ appendDelimiterError $ 1無法投射到scala.Function1 ' –