Spark数据帧:不支持类型Unit的Schema

时间:2016-06-28 22:35:30

标签: apache-spark apache-spark-sql spark-dataframe

我使用的是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)

1 个答案:

答案 0 :(得分:1)

foreach中的udf更改为map,如下所示将消除此异常:

def getSplitAtWeight = udf((str: String) => { 
    str.split('|').map(_.split('#')(2).toDouble)
})

您的方法存在的问题是foreach上的List方法没有返回任何内容,即其结果类型为Unit,这就是您获取Exception的原因。要了解有关foreach的更多信息,请查看this blog