如何在Spark中将数据帧作为函数参数传递

时间:2016-12-09 19:13:36

标签: scala apache-spark spark-dataframe

我正在实现一个以整个数据帧为参数的程序。我知道这可能不是Spark的支持,但我想知道是否有一个很好的方法来解决我的问题。

我有一个像这样的Spark数据框:

Item_sale_table 
    item_id   date   Sale Amount 
    aaa       3-11      20
    aaa       3-12      21
    aaa       3-13      28
    ...       ...       ...
    bbb       3-11      17
    bbb       3-12      12
    ...       ...       ...
    ccc       3-11      9
    ...       ...       ...

Item_List

item_id   description
aaa          xxxx
bbb          xxxyx
ccc          zxsa
...

我想做的是,从item_list表中获取每个项目,并从item_sale表中收集该项目的历史数据,并应用一个函数(这里是一个简单的计数函数)它

所以项目处理功能看起来像

def ItemProcess (item_id: String, Dataset: DataFrame)  = {

      val item_count = Dataset.filter(Dataset("item_id").contains(item_id)).count()

      println(item_id,item_count)

  }

调用此函数的主要功能是

val item_count_collection = item_list.select("item_id").foreach(x => ItemProcess(x(0).toString, item_sale_table))

然后我得到了

ERROR Executor: Exception in task 4.0 in stage 11.0 (TID 504)
java.lang.NullPointerException
    at org.apache.spark.sql.DataFrame.resolve(DataFrame.scala:151)
    at org.apache.spark.sql.DataFrame.col(DataFrame.scala:664)
    at org.apache.spark.sql.DataFrame.apply(DataFrame.scala:652)

所以我在foreach函数中传递了整个数据帧。我认为这是问题。但是如何纠正呢?

========更新=======

我发现即使我像这样嵌入了项目处理功能,我也会得到NullPointerException

val item_count_collection = item_list.select("item_id").foreach(x => Item_sale_table.filter(Item_sale_table("item_id").contains(x(0).toString)).count())

1 个答案:

答案 0 :(得分:0)

聚合和(可选)加入:

val item_counts = item_sale_table.groupBy("item_id").count()

可选择加入:

item_list.join(item_counts, Seq("item_id"))

contains(效率低下):

item_list.join(
   item_counts,
   item_counts("item_id").contains(item_list("item_id"))),
  "left"
)