Как объединить несколько значений из одного столбца данных и вернуть его в виде меньшего DF? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть этот исходный 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...