Для Spark 2.4+ используйте функцию transform
.
Для каждого элемента массива подставьте ключ с помощью substring_index
и обрежьте начальные и конечные кавычки с помощью функции trim
.
df.show(truncate=False)
#+---+----+------------------------------------+
#|ID |data|value |
#+---+----+------------------------------------+
#|e1 |D1 |["K1":"V1", "K2": "V2", "K3": "V3"] |
#|e2 |D2 |["K1": "V1", "K3": "V3"] |
#|e3 |D1 |["K1": "V1", "K2": "V2"] |
#|e4 |D3 |["K2": "V2", "K1": "V1", "K3": "V3"]|
#+---+----+------------------------------------+
new_value = """ transform(value, x -> trim(BOTH '"' FROM substring_index(x, ':', 1))) """
df.withColumn("value", expr(new_value)).show()
#+---+----+------------+
#|ID |data|value |
#+---+----+------------+
#|e1 |D1 |[K1, K2, K3]|
#|e2 |D2 |[K1, K3] |
#|e3 |D1 |[K1, K2] |
#|e4 |D3 |[K2, K1, K3]|
#+---+----+------------+
Если вы хотите получить результат в виде строки, разделенной |
, вы можете использовать array_join
, например:
df.withColumn("value", array_join(expr(new_value), "|")).show()
#+---+----+--------+
#|ID |data|value |
#+---+----+--------+
#|e1 |D1 |K1|K2|K3|
#|e2 |D2 |K1|K3 |
#|e3 |D1 |K1|K2 |
#|e4 |D3 |K2|K1|K3|
#+---+----+--------+