2016-09-02 20 views
2

我試圖在Scala的Spark數據框的列上應用一個函數。該列是一個字符串類型,我想將字符串中的每個標記與「_」分隔符(例如「A B」 - >「A_B」)連接起來。我正在這樣做:將函數(mkString)應用於Spark數據框中的整個列,如果列名具有「。」,則會出錯。

val converter: (String => String) = (arg: String) => {arg.split(" ").mkString("_")} 
val myUDF = udf(converter) 
val newDF = oldDF 
    .withColumn("TEST", myUDF(oldDF("colA.B"))) 
display(newDF) 

這適用於數據框中名稱不帶圓點(「。」)的列。然而,在列名點「colA.B」似乎被打破了代碼,並引發錯誤:

org.apache.spark.sql.AnalysisException: Cannot resolve column name "colA.B" among (colA.B, col1, col2); 

我想周圍的工作就是重命名列(類似於this),但我我寧願不這樣做。

+0

PLS [查看](HTTP:/ /stackoverflow.com/questions/30359539/accessing-column-names-with-periods-spark-sql-1-3) –

+1

可能你正在面對這個[issue](https://issues.apache.org/jira/browse/SPARK-15230)看起來像它在2.0中固定了哪個版本的火花? –

+0

我使用的是Spark 1.6.2,因爲df.map(row => ...)似乎不適用於Spark 2.0。我確定它確實如此,但是我使用了1.6.2,直到我能弄明白如何。 – Feynman27

回答

2

你可以用反引號嘗試像例子(source

val df = sqlContext.createDataFrame(Seq(
    ("user1", "task1"), 
    ("user2", "task2") 
)).toDF("user", "user.task") 
df.select(df("user"), df("`user.task`")).show() 


+-----+---------+ 
| user|user.task| 
+-----+---------+ 
|user1| task1| 
|user2| task2| 
+-----+---------+ 

低於你的情況,將您需要備份報價等列函數之前...

相關問題