将函数(mkString)应用于Spark数据帧中的整个列,如果列名称具有“。”,则会出错。

时间:2016-09-02 18:40:40

标签: scala apache-spark spark-dataframe

我正在尝试在Scala中的Spark数据帧的列上应用函数。该列是String类型,我想将字符串中的每个标记与“_”分隔符(例如“A B” - >“A_B”)连接起来。我这样做是为了:

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),但我不想这样做。

1 个答案:

答案 0 :(得分: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|
+-----+---------+

在申请功能之前,你需要回复引用这样的专栏......