Dataframe 使用udf在spark数据框中添加引用另一个数据框的列

Dataframe 使用udf在spark数据框中添加引用另一个数据框的列,dataframe,apache-spark,user-defined-functions,Dataframe,Apache Spark,User Defined Functions,我有一个数据框“Forecast”,其中有列-Store、Item、FC\u startdate、FC\u enddate、FC\u qty 另一个数据框“Actual”,包含列-门店、商品、销售日期、销售数量 我想用传递的参数创建一个UDF,p\u store,p\u item,p\u startdate,p\u enddate,并获取这些日期之间的Sales\u qty之和,并将其作为一个新列(Act\u qty)添加到“Forecast”数据框中 但是spark不允许在UDF中传递数据帧和

我有一个数据框“
Forecast
”,其中有列-
Store、Item、FC\u startdate、FC\u enddate、FC\u qty

另一个数据框“
Actual
”,包含列-
门店、商品、销售日期、销售数量

我想用传递的参数创建一个
UDF
p\u store,p\u item,p\u startdate,p\u enddate
,并获取这些日期之间的
Sales\u qty
之和,并将其作为一个新列(
Act\u qty
)添加到“
Forecast
”数据框中

但是spark不允许在UDF中传递数据帧和预测字段


不使用合并-解决方案是什么

定义和注册udf后,可以在转换代码中使用udf函数,就像spark sql库的任何其他函数一样

与spark sql库函数类似,您只能传递dataframe的列并返回已处理的值无法将数据帧传递给udf。

因此,在您的情况下,您可以使用udf作为函数将当前数据帧转换为另一个数据帧,然后继续。

一条黄金法则是,任何可以在没有
udf
的情况下完成的操作都应该在没有
udf
的情况下完成,当您需要对单个行进行非常特定的转换时,应该更广泛地应用它们,而不是针对您描述的大型聚合类型操作

在这种情况下,您似乎可以使用SparkSQL:选择
Actual
的行,其中
Saledate
介于您想要的日期之间(Spark本机理解日期,请参阅文档)、每个
存储
项目
的销售数量总和,或者两者都是(我不确定您打算做什么),重命名sum列,并再次使用
Store
或两者将此新数据框连接到
Forecast


但是,如果您坚持使用
UDFs
,您将不得不传递列,而不是数据帧作为参数,但我想不出一种简单的方法来实现您所描述的使用
UDFs
,同时又不牺牲大量性能。

spark允许UDF使用数据帧,请提供您尝试使用的样本数据和UDF。