вы можете достичь этого, сгруппировав по ключу и, возможно, региону и агрегировав с collect_list
, используя ragex ^[^_]+
, вы получите все символы до _
символа.
ОБНОВЛЕНИЕ : Вы можете использовать (\\d{1,})
regex, чтобы найти все числа из строки (захват групп), например, если у вас есть row_123_456_unit
и ваша функция выглядит как regexp_extract('val,"(\\d{1,})",0)
, вы получите 123
, если вы измените последний параметр на 1, тогда вы получите 456
. Надеюсь, это поможет. тестовое регулярное выражение
df.printSchema()
df.show()
val regex1 = "^[^_]+" // until '_' character
val regex2 = "(\\d{1,})" // capture group of numbers
df.groupBy('region, regexp_extract('key, regex1, 0))
.agg('region, collect_list('key).as("key"), collect_list('val).as("val"))
.select('region,
'key.getItem(0).as("key"),
'val.getItem(0).as("val"),
'val.getItem(1).as("Category"),
'val.getItem(2).as("Unit")
).show()
вывод:
root
|-- region: string (nullable = true)
|-- key: string (nullable = true)
|-- val: string (nullable = true)
+------+-------------+-----+
|region| key| val|
+------+-------------+-----+
|Sample| row1| 6|
|Sample|row1_category|Cat 1|
|Sample| row1_Unit| Kg|
|Sample| row2| 4|
|Sample|row2_category|Cat 2|
|Sample| row2_Unit| ltr|
+------+-------------+-----+
+------+----+---+--------+----+
|region| key|val|Category|Unit|
+------+----+---+--------+----+
|Sample|row1| 6| Cat 1| Kg|
|Sample|row2| 4| Cat 2| ltr|
+------+----+---+--------+----+