我很好奇,为什么Spark Scala不能在 Dataframe 上使用:
df.withColumn("answer", locate(df("search_string"), col("hit_songs"), pos=1))
它使用UDF,但不是上面所述的那样。列与字符串方面。看起来很笨拙,缺乏方面。如何将列转换为字符串,以便传递来定位需要字符串的位置。df("search_string")
允许生成一个字符串是我的理解。
但得到的错误是:
command-679436134936072:15: error: type mismatch;
found : org.apache.spark.sql.Column
required: String
df.withColumn("answer", locate(df("search_string"), col("hit_songs"), pos=1))
1条答案
按热度按时间thtygnil1#
了解问题所在
我不确定您使用的是哪个版本的Spark,但是
locate
方法在Spark 3.3.1(当前最新版本)和Spark 2.4.5(运行在我的本地Spark shell上的版本)上都有以下函数签名。此函数签名如下:
所以
substr
不能是Column
,它应该是String
。在你的例子中,你使用的是df("search_string")
。这实际上调用了apply
方法,函数签名如下:因此,由于
locate
函数需要一个String
,因此您遇到问题是有道理的。尝试修复您的问题
如果我没理解错的话,你希望能够在没有UDF的情况下,从一列的字符串中找到另一列的子字符串。你可以在
Dataset
上使用map
来实现这一点。类似如下:一旦进入了强类型
Dataset
的map
操作,Scala语言就可以随意使用了。希望这对你有帮助!