如何在Spark

时间:2019-11-26 12:56:55

标签: scala apache-spark

我必须编写一个udf,其参数为Array [(Date,Double)](collect_list(struct(col1,col2))的结果。)

function (c) {
return function () {
var baseDF = c.cu.loadParquetDF(c.sqc, '/path', true).selectExpr('`date`', '`value`', '`svalue`');
var resDF = new (Java.type('org.apache.spark.ml.feature.SQLTransformer'))().setStatement('select date_range_build(valuePairs) from (select collect_list(struct(`date`,`value`)) as valuePairs from __THIS__)').transform(baseDF);
return resDF;
}().limit(200);
}

(1)使用以下定义时:

def DateRangeBuild(dateValuePairs: Seq[(AnyRef, Number)]) = {...}
sql.udf.register("date_range_build", TimeRangeUdfs.DateRangeBuild(_: Seq[(AnyRef, Number)]))

java.lang.ClassCastException:org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema无法转换为scala.Tuple2

(2)当我使用以下定义时:

def DateRangeBuild(dateValuePairs: GenericRowWithSchema) = {...}
sql.udf.register("date_range_build", TimeRangeUdfs.DateRangeBuild(_: GenericRowWithSchema))

java.lang.ClassCastException:scala.collection.mutable.WrappedArray $ ofRef无法转换为org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema

(3)使用以下定义时:

def DateRangeBuild(dateValuePairs: Seq[GenericRowWithSchema]) = {...}
sql.udf.register("date_range_build", TimeRangeUdfs.DateRangeBuild(_: Seq[GenericRowWithSchema]))

IDEA提示:没有类型为:Nothing,Nothing的隐式参数。

组装并运行后:

未定义函数:“ date_range_build”。此函数既不是注册的临时函数,也不是在数据库“默认”中注册的永久函数

1 个答案:

答案 0 :(得分:0)

您的输入应为Seq[Row],然后在Row上使用(Date,Double)方法将getAs[T](...)映射到Row