Приведение строки типа "[1, 2, 3]" в массив
Довольно просто. У меня есть массив, как столбец, закодированный в виде строки (varchar
) и хочу разыграть array
(так что я могу тогда explode
это и манипулировать элементами в "длинном" формате).
Два наиболее естественных подхода не работают:
-- just returns a length-1 array with a single string element '[1, 2, 3]'
select array('[1, 2, 3]')
-- errors: DataType array is not supported.
select cast('[1, 2, 3]' as array)
Уродливый / неэластичный / обходной способ получить то, что я хочу, это:
select explode(split(replace(replace('[1, 2, 3]', '['), ']'), ', '))
-- '1'
-- '2'
-- '3'
(regexp_replace
мог бы перечислить два replace
но регулярные выражения в квадратных скобках - это всегда боль; ltrim
а также rtrim
или же trim(BOTH '[]'...)
также может быть использован)
Есть ли более краткий способ сделать это? Я на Spark 2.3.1.
1 ответ
Я предполагаю, что элементы являются цифрами. Но ты получил идею
>>> s = '[1,2,3]'
>>> list(c for c in s if c.isdigit())
['1', '2', '3']
>>> map(int, list(c for c in s if c.isdigit()))
[1, 2, 3]