Spark发送DataFrame作为HTTP Post请求的主体

时间:2018-05-02 16:15:38

标签: scala rest apache-spark

我有一个数据框,我想将其作为HTTP Post请求的正文发送,这是最好的Sparky方式吗?
如何控制多个HTTP请求? 如果记录数量变大,有没有办法将数据帧分成多个HTTP Post调用?

让我们说我的数据框是这样的:

+--------------------------------------+------------+------------+------------------+
|               user_id                |    city    | user_name  |   facebook_id    |
+--------------------------------------+------------+------------+------------------+
| 55c3c59d-0163-46a2-b495-bc352a8de883 | Toronto    | username_x | 0123482174440907 |
| e2ddv22d-4132-c211-4425-9933aa8de454 | Washington | username_y | 0432982476780234 |
+--------------------------------------+------------+------------+------------------+

我想在此帖子的user_id

的HTTP Post请求正文中有facebook_idlocalhost:8080/api/spark

1 个答案:

答案 0 :(得分:2)

您可以使用Dataframe上的foreachPartition方法实现此目的。我在这里假设您想要并行处理Dataframe中的每一行的Http调用。 foreachPartition并行运行Dataframe的每个分区。如果您希望通过将makeHttpCall方法的签名从Row更改为Iterator[Row]

,则可以在单个HTTP帖子调用中将多个行一起批处理
  def test(): Unit = {
    val df: DataFrame = null
    df.foreachPartition(_.foreach(x => makeHttpCall(x)))
  }

  def makeHttpCall(row: Row) = {
    val json = Json.obj("user_name" -> row.getString(2), "facebook_id" -> row.getString(3))
    /**
      * code make Http call
      */
  }

用于制作批量Http请求makeHttpCall。确保数据框中有足够数量的分区,以便每个分区都足够小,可以发出Http Post请求。

import org.apache.spark.sql.{DataFrame, Row}
import play.api.libs.json.Json

  def test(): Unit = {
    val df: DataFrame = null
    df.foreachPartition(x => makeHttpCall(x))
  }

  def makeHttpCall(row: Iterator[Row]) = {
    val json = Json.arr(row.toSeq.map(x => Json.obj("user_name" -> x.getString(2), "facebook_id" -> x.getString(3))))
    /**
      * code make Http call
      */
  }