Scala Spark发送数据帧作为HTTP Post请求的主体

Scala Spark发送数据帧作为HTTP Post请求的主体,scala,rest,apache-spark,Scala,Rest,Apache Spark,我有一个数据帧,我想把它作为httppost请求的主体发送,最好的Sparky方法是什么? 如何控制多个HTTP请求? 如果记录的数量越来越多,有没有办法将发送的数据帧拆分为多个HTTP Post调用 假设我的数据框是这样的: +--------------------------------------+------------+------------+------------------+ | user_id | city

我有一个数据帧,我想把它作为
httppost
请求的主体发送,最好的
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 |
+--------------------------------------+------------+------------+------------------+

我希望在对该端点的HTTP Post请求主体中包含
user\u id
facebook\u id
localhost:8080/api/spark
,您可以在数据帧上使用
foreachPartition
方法实现这一点。我在这里假设您希望并行地对数据帧中的每一行进行Http调用
foreachPartition
对数据帧的每个分区进行并行操作。如果希望在单个HTTP post调用中批处理多行,也可以通过将
makeHttpCall
方法的签名从
Row
更改为
Iterator[Row]

  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
      */
  }

我更喜欢发送一个批量请求,并且在正文中有一个JSON对象数组,
JSON
的导入是什么?我的编辑的建议中没有一个对meI有效的是使用play JSON。但是,您可以使用任何符合您需要的基于scala/java的json库。谢谢,在我的代码中也有关于签名的抱怨,
在使用第二种方法时无法使用此类签名解析引用makeHttpCall
。foreachPartition(x=>makeHttpCall(x))更新了答案