簡體   English   中英

如何在 spark 中使用輸入 Array[(Date, Double)] 注冊 udf

[英]How to register udf with input Array[(Date, Double)] in 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'。 此函數既不是已注冊的臨時函數,也不是在數據庫“默認”中注冊的永久函數

您的輸入應該是Seq[Row] ,然后使用Row上的getAs[T](...)方法將Row映射到(Date,Double)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM