У меня есть этот исходный DF и некоторые переменные:
val sourceDF = Seq(
("123", "domestic"),
("234", "domestic"),
("345", "international"),
("456", "international")
).toDF("id", "id_type")
val locale = "en_US"
val siteId = "1"
Мне нужно построить тело запроса для API из приведенных выше данных. Пример тела запроса находится внизу.
Во-первых, я расширяю этот DF, чтобы он содержал столбец с одиночными запросами API:
def createRequest(id: String,
locale: String,
siteId: String,
idType: String
): String = {
s"""{"id":"$id","siteId":"$siteId","locale":"$locale","idType":"idType"}"""
}
val createRequestUdf = udf(createRequest _)
val sourceDFWithRequests = sourceDF
.withColumn("request", createRequestUdf(
$"id",
lit(locale),
lit(siteId),
$"id_type"))
Результат выглядит следующим образом:
val sourceDFWithRequests = Seq(
("123", "domestic", """{"id":"123","siteId":"1","locale":"en_US","idType":"idType"}"""),
("234", "domestic", """{"id":"234","siteId":"1","locale":"en_US","idType":"idType"}"""),
("345", "international", """{"id":"345","siteId":"1","locale":"en_US","idType":"idType"}"""),
("456", "international", """{"id":"456","siteId":"1","locale":"en_US","idType":"idType"}""")
).toDF("id", "id_type", "request")
Теперь, в конце концов, мне нужно получить:
val result = Seq(
("""{"requests":[
{"id":"123","siteId":"1","locale":"en_US","idType":"idType"},
{"id":"234","siteId":"1","locale":"en_US","idType":"idType"}
]}"""),
("""{"requests":[
{"id":"345","siteId":"1","locale":"en_US","idType":"idType"},
{"id":"456","siteId":"1","locale":"en_US","idType":"idType"}
]}""")
).toDF("bulk_requests")
В этом примере объединены 2 запроса. На практике мне нужно собрать до 100 запросов.
Я бы хотел достичь этого, не преобразовывая столбец request
из sourceDFWithRequests
DF в список, а затем создавая массовые запросы и затем преобразовывая их обратно. в DF.