【问题标题】:add column in spark dataframe referring another dataframe using udf在火花数据框中添加列,使用 udf 引用另一个数据框
【发布时间】:2020-04-20 20:41:27
【问题描述】:

我有一个带有列的数据框“Forecast” - Store, Item, FC_startdate, FC_enddate, FC_qty

另一个带有列的数据框“Actual” - Store, Item, Saledate, Sales_qty

我想创建一个 UDF 并传递参数 - p_store, p_item, p_startdate, p_enddate 并在这些日期之间获取 Sales_qty 的总和,并将其作为新列 (Act_qty) 添加到“Forecast”数据框。

但 spark 不允许将 UDF 中的数据帧与预测字段一起传递。

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

【问题讨论】:

  • spark 允许使用 DataFrame 的 UDF,您能否提供示例数据以及您尝试使用的 UDF。

标签: dataframe apache-spark user-defined-functions


【解决方案1】:

一个黄金法则是,任何可以在没有UDFs 的情况下完成的事情都应该在没有UDFs 的情况下完成,它们应该被应用得更多——所以当您需要对单个行进行非常具体的转换时,而不是为大聚合类型你描述的操作。

在这种情况下,您似乎可以只使用 SparkSQL:选择Actual 的行,其中Saledate 位于您想要的日期之间(Spark 本身理解日期,请参阅文档),总和SalesQty根据StoreItem 或两者(我不确定你打算做什么),重命名总和列并将这个新数据框加入Forecast 使用StoreItem 或再次使用两者。

但是,如果您坚持使用 UDFs,您将不得不传递列,而不是数据框作为参数,但我想不出一种直接的方法来实现您使用 UDFs 描述的内容而不牺牲很多性能。

【讨论】:

    【解决方案2】:

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

    与 spark-sql 库函数类似,您只能传递数据框的列并返回处理后的值。 数据帧不能传递给 udf。

    因此,在您的情况下,您可以使用 udf 作为函数将当前数据帧转换为另一个数据帧,然后继续。 https://docs.databricks.com/spark/latest/spark-sql/udf-scala.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      相关资源
      最近更新 更多