Spark:加入UDF或map函数

时间:2016-12-18 11:29:21

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

我必须编写一个复杂的UDF,我必须在其中使用不同的表进行连接,并返回匹配的数量。实际的使用案例要复杂得多,但我在这里将案例简化为可重复性最低的代码。这是UDF代码。

def predict_id(date,zip):
    filtered_ids = contest_savm.where((F.col('postal_code')==zip)  & (F.col('start_date')>=date))
    return filtered_ids.count()

当我使用下面的代码定义UDF时,我得到一长串控制台错误:

predict_id_udf = F.udf(predict_id,types.IntegerType())

错误的最后一行是:

py4j.Py4JException: Method __getnewargs__([]) does not exist

我想知道最好的方法是什么。我也试过map这样:

result_rdd = df.select("party_id").rdd\
  .map(lambda x: predict_id(x[0],x[1]))\
  .distinct()

它也导致了类似的最终错误。我想知道,无论如何,我可以在UDF或map函数中为原始数据帧的每一行进行连接。

1 个答案:

答案 0 :(得分:0)

  

我必须编写一个复杂的UDF,我必须在其中使用不同的表进行连接,并返回匹配的数量。

设计不可能。我想要达到这样的效果,你必须使用高级DF / RDD运算符:

df.join(ontest_savm,
    (F.col('postal_code')==df["zip"])  & (F.col('start_date') >= df["date"])
).groupBy(*df.columns).count()