Приведение строки типа "[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]
Другие вопросы по тегам