Pyspark - итерация по строке для извлечения нескольких пар ключ-значение

В настоящее время у меня есть текстовая строка, разделенная амперсандом, которую мне нужно проанализировать с помощью PySpark, чтобы извлечь пары ключ-значение в массив / словарь. Я могу сделать это с большинством тегов, которые у меня есть в строке, но проблема в том, что у некоторых ключей есть индекс, и он может варьироваться для каждой записи, но ключи всегда будут одинаковыми (если это имеет смысл. Что я хотел бы сделать это, перебрать строку

Пример ввода:

"{pr1nm=Apples&pr1id=1111111&pr1pr=200.00&pr1qt=1&pr2nm=Pears&pr2id=1111112&pr2pr=300.00&pr2qt=2}"

Желаемый результат:

[{
  "ProductName":"Apples",
  "ProductId": "1111111",
  "ProductPrice":"200.00",
  "ProductQuantity":"1",
  "ProductName":"Pears",
  "ProductId":"1111112",
  "ProductPrice":"300.00"
  "ProductQuantity":"2"
}]

Кроме того, если у меня есть другие теги в той же строке, которые не относятся к продукту, например:

"{dl=https://stackoverflow.com/posts/XXXXX&t=pageview&pr1nm=Apples&pr1id=1111111&pr1pr=200.00&pr1qt=1&pr2nm=Pears&pr2id=1111112&pr2pr=300.00&pr2qt=2}"

вывод должен быть примерно таким с продуктами во вложенном массиве:

{"DocumentLocation":"https://stackoverflow.com/posts/XXXXX",
  "HitType":"pageview",
   "Products": [{
                 "ProductName":"Apples",
                 "ProductId": "1111111",
                 "ProductPrice":"200.00",
                 "ProductQuantity":"1",
                 "ProductName":"Pears",
                 "ProductId":"1111112",
                 "ProductPrice":"300.00"
                 "ProductQuantity":"2"
               }]
}

person totoro_dev    schedule 03.02.2020    source источник


Ответы (1)


Вы можете использовать str_to_map для преобразования строки в столбец карты. нравится:

df = df.withColumn("input", expr("ltrim('{', rtrim('}', input))"))\
       .withColumn("input", expr("str_to_map(input, '&', '=')"))

df.show(truncate=False)

+-------------------------------------------------------------------------------------------------------------------------------+
|input                                                                                                                          |
+-------------------------------------------------------------------------------------------------------------------------------+
|[pr1nm -> Apples, pr1id -> 1111111, pr1pr -> 200.00, pr1qt -> 1, pr2nm -> Pears, pr2id -> 1111112, pr2pr -> 300.00, pr2qt -> 2]|
+-------------------------------------------------------------------------------------------------------------------------------+

Затем, если вам нужна строка JSON, используйте to_json функция:

df.withColumn("input", to_json(col("input"))) \
  .show(truncate=False)

+--------------------------------------------------------------------------------------------------------------------------------+
|input                                                                                                                           |
+--------------------------------------------------------------------------------------------------------------------------------+
|{"pr1nm":"Apples","pr1id":"1111111","pr1pr":"200.00","pr1qt":"1","pr2nm":"Pears","pr2id":"1111112","pr2pr":"300.00","pr2qt":"2"}|
+--------------------------------------------------------------------------------------------------------------------------------+
person blackbishop    schedule 03.02.2020