![](/img/trans.png)
[英]How to read JSON body from Akka HTTP POST request and send the final response as JSON array
[英]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_id
和facebook_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.