Spark 将 DataFrame 作为 HTTP Post 请求的正文发送

问题描述 投票:0回答:2

我有一个数据帧,我想将其作为

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 |
+--------------------------------------+------------+------------+------------------+

我希望在此端点的 HTTP Post 请求正文中包含

user_id
facebook_id
localhost:8080/api/spark

scala rest apache-spark
2个回答
7
投票

您可以在 Dataframe 上使用

foreachPartition
方法来实现此目的。我假设您想并行地对 Dataframe 中的每一行进行 Http 调用。
foreachPartition
并行操作 Dataframe 的每个分区。如果您想在单个 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
      */
  }

0
投票

对于Scala 2.12.15、Spark 3.3.0,上述解决方案几乎是正确的:

如果我使用标准数据框(加载了spark.read.csv()),我首先需要将其转换为RDD,例如:

df.rdd.foreachPartition(x => makeHttpCall(x))

df.rdd.foreachPartition(_.foreach(x => makeHttpCall(x)))

因此,如果您遇到我的情况,收到类似以下错误:“值映射不是对象的成员”

类型不匹配;找到:对象,需要迭代器[org.apache.spark.sql.Row] 现在你知道要尝试什么了。

© www.soinside.com 2019 - 2024. All rights reserved.