Это еще один подход, который я разработал.Он включает в себя различные операторы, однако все эти операторы могут быть объединены в один для получения желаемого результата.
После создания исходного кадра данных с именем 'df',
df.show(5,False)
+---+----------------------------+
|id |data |
+---+----------------------------+
|001|[{"index": 1}, {"index": 2}]|
|002|[{"index": 3}, {"index": 4}]|
+---+----------------------------+
df2= df.select (col ('id'), split (df.data, ','). alias ('list'))
Это создает фрейм данных с именем 'df2', который разбит на второй столбецв тип массива.
df2.show(5,False)
+---+-------------------------------+
|id |list |
+---+-------------------------------+
|001|[[{"index": 1}, {"index": 2}]]|
|002|[[{"index": 3}, {"index": 4}]]|
+---+-------------------------------+
затем, запустив функцию разнесения, df3 = df2.select (col ('id'), explode (df2.list))
df3.show(5,False)
+---+--------------+
|id |col |
+---+--------------+
|001|[{"index": 1} |
|001| {"index": 2}]|
|002|[{"index": 3} |
|002| {"index": 4}]|
+---+--------------+
, а затемby, df4 = df3.select (col ('id'), regexp_extract ('col', '(\ d +)', 1) .alias ('no_only')) это преобразование проверяет число в разбитом столбце.
df4.show(5,False)
+---+-------+
|id |no_only|
+---+-------+
|001|1 |
|001|2 |
|002|3 |
|002|4 |
+---+-------+