将函数 (mkString) 应用于 Spark 数据帧中的整个列,如果列名包含“.”,则会出错

Applying a function (mkString) to an entire column in Spark dataframe, error if column name has "."

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

您可以像下面的例子那样尝试使用反引号 (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|
+-----+---------+

在你的情况下,在应用函数之前你需要反引用这样的列...