2016-06-28 45 views
0

我使用星火1.5.0,我有这个问题:星火据帧:架构类型单位不支持

val df = paired_rdd.reduceByKey { 
    case (val1, val2) => val1 + "|" + val2 
}.toDF("user_id","description") 

下面是DF样本数据,你可以看到在列说明具有 这格式(text1#text3#weight | text1#text3#weight|....)

USER1

book1#author1#0.07841217886795074|tool1#desc1#0.27044260397331488|song1#album1#-0.052661673730870676|item1#category1#-0.005683148395350108

我想解决这DF基于体重这里降序排列是我的尝试:

首先将内容分割为“|”然后为每个字符串,以“#”分裂他们,并得到第三根弦是重量,然后再转换为双精度值基于UDF返回称重值

val getSplitAtWeight = udf((str: String) => { 
    str.split("|").foreach(_.split("#")(2).toDouble) 
}) 

排序(从大到小方式)

val df_sorted = df.sort(getSplitAtWeight(col("description")).desc) 

我得到以下错误:

Exception in thread "main" java.lang.UnsupportedOperationException: Schema for type Unit is not supported at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:153) at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:29) at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:64) at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:29) at org.apache.spark.sql.functions$.udf(functions.scala:2242)

回答

0

变化foreachudfmap如下将消除异常:

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

的问题,你的方法是,在Listforeach方法不返回任何内容,即,其结果是Unit类型,这就是为什么你得到了Exception的。要详细了解foreach,请检查this blog

+0

现在我得到这个错误:例外在线程“主要” org.apache.spark.sql.AnalysisException:无法解析“UDF(注释)DESC”由于数据类型不匹配:不能排序的数据类型的数组; \t at org.apache.spark.sql.catalyst.analysis.package $ AnalysisErrorAt.failAnalysis(package.scala:42) – user3803714

+0

不完全确定。在火花1.6.0上,没有例外。但我认为这意味着对于分割后的描述中的每个字符串,都会得到四个数字,这是'array '的来源。并且spark不知道如何对包含数组的列进行排序。而且,在继续处理之前,您要排序的数字也是一个很好的问题。 – Psidom