apache spark filter方法中的HTTP API调用

时间:2019-04-17 05:21:58

标签: apache-spark apache-spark-sql

我有一个Spark数据框,需要根据条件进行过滤。

条件是::数据框中有一个列"keyword",我需要调用传递此keyword列值的API。将为所有keyword列值完成此操作。 API将发回一个我需要与阈值匹配的数字。如果更大,则需要返回true,否则返回false。

为此我写了一个 UDF ,如下所示。

    val filteredDf = df.filter(apiUdf(col("keyword_text")) === true))

    val apiUdf = udf((topic: String) => {..
     .....
     HTTP API call .. 
     parse the result ... 
     find out the number from the API resposne.. 
     and then compare it with some threshold value and return true/false

这里的问题是,我打开和关闭HTTP连接的次数达到了我有很多关键字的次数。有人可以告诉我如何优化此操作,以及这里的UDF方法是否还可以?

1 个答案:

答案 0 :(得分:0)

Spark UDFs用于处理表示返回值的复杂逻辑。

在分布式数据处理中,调用外部URL的设计/方法执行者不是很好。

  • 其缩放问题与数据大小和次数无关 连接打开/关闭。
  • 而且,在大多数生产环境中,执行程序节点是 不会暴露在互联网上。

我会建议

  1. 保存/收集所有col(“ keyword_text”)
  2. 为每个关键字调用HTTP API(不是spark udf)并获得响应
  3. 将数据另存为some_id,keyword_text,api_result

现在有了df1(some_id,keyword_text,api_result)

您可以加入df和f1并使用api_result进行过滤。

我不确定,如果HTTP API接受批量/批处理请求(通常大多数会这样做),您可以考虑采用这种方法。