我使用的是Spark 1.5.0,我遇到了这个问题:
val df = paired_rdd.reduceByKey {
case (val1, val2) => val1 + "|" + val2
}.toDF("user_id","description")
以下是df的示例数据,您可以看到列描述
格式为(text1#text3#weight | text1#text3#weight|....)
用户1
BOOK1#作者1#0.07841217886795074 |工具1#DESC1#0.27044260397331488 |松1#album1#-0.052661673730870676 | ITEM1#类别1#-0.005683148395350108
我想根据重量按降序排序这个df,这是我尝试过的:
首先将内容拆分为“|”然后对于每个字符串,将它们拆分为“#”并获得第三个字符串,然后将其转换为double值
val getSplitAtWeight = udf((str: String) => {
str.split("|").foreach(_.split("#")(2).toDouble)
})
根据udf返回的权重值(以递减方式)进行排序
val df_sorted = df.sort(getSplitAtWeight(col("description")).desc)
我收到以下错误:
线程“main”中的异常java.lang.UnsupportedOperationException: 不支持类型为Unit的模式 org.apache.spark.sql.catalyst.ScalaReflection $ class.schemaFor(ScalaReflection.scala:153) 在 org.apache.spark.sql.catalyst.ScalaReflection $ .schemaFor(ScalaReflection.scala:29) 在 org.apache.spark.sql.catalyst.ScalaReflection $ class.schemaFor(ScalaReflection.scala:64) 在 org.apache.spark.sql.catalyst.ScalaReflection $ .schemaFor(ScalaReflection.scala:29) 在org.apache.spark.sql.functions $ .udf(functions.scala:2242)
答案 0 :(得分:1)
将foreach
中的udf
更改为map
,如下所示将消除此异常:
def getSplitAtWeight = udf((str: String) => {
str.split('|').map(_.split('#')(2).toDouble)
})
您的方法存在的问题是foreach
上的List
方法没有返回任何内容,即其结果类型为Unit
,这就是您获取Exception
的原因。要了解有关foreach
的更多信息,请查看this blog。