SPARK 数据框错误:在使用 UDF 拆分列中的字符串时无法转换为 scala.Function2

Posted

技术标签:

【中文标题】SPARK 数据框错误:在使用 UDF 拆分列中的字符串时无法转换为 scala.Function2【英文标题】:SPARK dataframe error: cannot be cast to scala.Function2 while using a UDF to split strings in column 【发布时间】:2016-09-21 21:35:09 【问题描述】:

当我使用 udf 按分隔符拆分列中的字符串时,我不断收到错误消息。我正在使用 Scala

Error: java.lang.ClassCastException: $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$anonfun$1 cannot be cast to scala.Function2

不知道这是什么以及如何解决它。

这是我的 udf 和数据框:

val rsplit = udf((refsplit: String) => refsplit.split(":"))


+---------+--------------------+--------------------+
|     user|              jsites|             jsites1|
+---------+--------------------+--------------------+
|123ashish|m.mangahere.co:m....|m.mangahere.co:m....|
|456ashish|m.mangahere2.co:m...|m.mangahere2.co:m...|
|   ashish|m.mangahere.co:m....|m.mangahere.co:m....|
+---------+--------------------+--------------------+

jsites 列看起来像m.manghere.co:m.facebook.com:.msn.com。我正在尝试使用 udf 将m.manghere.co:m.facebook.com:.msn.com 拆分为:

我不断收到这个错误

【问题讨论】:

哪个代码实际上给出了这个错误?创建 UDF 或使用 UDF 时?如果是后者,你如何使用UDF? 在使用 udf 时。 ff.withColumn("split sites",rsplit(ff.col("jsites1"))) 你能提供一个最小的、完整的、可验证的例子吗?这两行加上一些猜测你之前和之后的内容并没有给我带来任何问题,通过一个完整的例子,我们也许可以实际重现它并找到原因。见***.com/help/mcve。它还可以帮助提供使用的 spark 版本,并检查您使用的版本与集群上的版本相同。 Scala 也是如此,您没有将 2.11 与 Spark 一起用于 2.10。 您是否尝试过使用内置 UDF 来拆分字符串?见spark.apache.org/docs/1.6.1/api/java/org/apache/spark/sql/…。 要尝试的另一件事是使用采用单个字符的split 重载(即refsplit.split(':'))。这可能是 UDF 的返回类型是 Java 数组而不是 Scala 数组的问题。 【参考方案1】:

org.apache.spark.sql.functions中提供了拆分功能

import org.apache.spark.sql.functions.col,split

val df = ???
df.withColumn("split sites",split(col("COLNAME"), "REGEX"))

问题有点老了,希望这对其他人有帮助。干杯

【讨论】:

【参考方案2】:

此类错误表示您在使用udf 时,参数列表不匹配。例如您尝试将 2 个参数传递给 udf,而 udf 只接受 1

【讨论】:

以上是关于SPARK 数据框错误:在使用 UDF 拆分列中的字符串时无法转换为 scala.Function2的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL 中的 udf

spark read 在 Scala UDF 函数中不起作用

将 UDF 动态应用于数据框中 N 列中的 1 到 N 列

如何在 Spark Scala 数据框中拆分逗号分隔的字符串并获取 n 个值?

Spark 根据现有列的映射值创建新列

使用 split() 在 python 数据框中拆分整列中的值