在Spark Scala中定义UDF

时间:2016-12-19 08:25:27

标签: apache-spark spark-dataframe

我需要在Spark中使用UDF,它接收时间戳,整数和另一个数据帧,并返回3个值的元组。

错误后我一直遇到错误,我不确定我是否正在尝试解决它。​​

这是功能:

def determine_price (view_date: org.apache.spark.sql.types.TimestampType , product_id: Int, price_df: org.apache.spark.sql.DataFrame) : (Double, java.sql.Timestamp, Double) = {
    var price_df_filtered = price_df.filter($"mkt_product_id" === product_id && $"created"<= view_date)
    var price_df_joined = price_df_filtered.groupBy("mkt_product_id").agg("view_price" -> "min", "created" -> "max").withColumn("last_view_price_change", lit(1))
    var price_df_final = price_df_joined.join(price_df_filtered, price_df_joined("max(created)") === price_df_filtered("created")).filter($"last_view_price_change" === 1)
    var result = (price_df_final.select("view_price").head().getDouble(0), price_df_final.select("created").head().getTimestamp(0), price_df_final.select("min(view_price)").head().getDouble(0))
    return result
}
val det_price_udf = udf(determine_price)

它给我的错误是:

error: missing argument list for method determine_price
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `determine_price _` or `determine_price(_,_,_)` instead of `determine_price`.

如果我开始添加参数,我会继续运行其他错误,例如Int expect Int.type found或object DataFrame不是包org.apache.spark.sql的成员

提供一些背景信息:

我的想法是,我有一个价格数据框,一个产品ID和一个创建日期,另一个数据框包含产品ID和查看日期。

我需要根据最后创建的价格条目确定价格,该价格条目早于查看日期。

由于每个产品ID在第二个数据框中都有多个查看日期。我认为UDF比交叉连接更快。如果有人有不同的想法,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您无法在UDF中传递 Dataframe ,因为UDF将在特定分区上的Worker上运行。因为你不能在Worker(Is it possible to create nested RDDs in Apache Spark?)上使用RDD,同样你也不能在Worker上使用DataFrame。

你需要解决这个问题!