簡體   English   中英

Spark 發送數據幀作為 HTTP Post 請求的主體

[英]Spark Send DataFrame as body of HTTP Post request

我有一個數據幀,我想將它作為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 |
+--------------------------------------+------------+------------+------------------+

我想在對這個端點localhost:8080/api/spark的 HTTP Post 請求的正文中有user_idfacebook_id

您可以在 Dataframe 上使用foreachPartition方法來實現這一點。 我在這里假設您要為 Dataframe 中的每一行並行進行 Http Call。 foreachPartition操作foreachPartition每個分區。 如果您想在單個 HTTP 后調用中將多行批處理在一起,也可以通過將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
      */
  }

@ rogue-one我有一個類似的問題,我想為數據框中的每一行發送多個http-rest api請求。 我可以使用df.foreachPartition()實現類似的方法。您能告訴我如何累積所有調用的json響應(以百萬為單位),然后將結果存儲到文件中。 我的輸出文件將在與df中的每個輸入行相對應的每一行中具有1個大嵌套json。 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM