【问题标题】:Applying a function (mkString) to an entire column in Spark dataframe, error if column name has "."将函数(mkString)应用于 Spark 数据帧中的整个列,如果列名有“。”则出错。
【发布时间】:2016-09-02 18:40:39
【问题描述】:

我正在尝试对 Scala 中的 Spark 数据框的一列应用函数。该列是字符串类型,我想将字符串中的每个标记与“_”分隔符连接起来(例如“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),但我不想这样做。

【问题讨论】:

  • 请see
  • 可能你正面临这个issue 似乎它在 2.0 中已修复,你使用的是哪个版本的 spark?
  • 我使用的是 Spark 1.6.2,因为 df.map(row=>...) 似乎不适用于 Spark 2.0。我敢肯定,但我正在使用 1.6.2,直到我弄清楚如何。

标签: scala apache-spark spark-dataframe


【解决方案1】:

您可以尝试使用反引号,如下例 (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|
+-----+---------+

在您的情况下,在应用功能之前,您需要反引号此类列...

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 2017-03-09
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多