非常简单。我有一个类似数组的列编码为字符串(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)
获得我想要的丑陋/不高度/circuit曲的方法是:
select explode(split(replace(replace('[1, 2, 3]', '['), ']'), ', '))
-- '1'
-- '2'
-- '3'
(regexp_replace
可以包含两个replace
,但带有方括号的正则始终很痛苦; ltrim
和rtrim
或trim(BOTH '[]'...)
也可以使用)
还有其他简洁的方法吗?我在Spark 2.3.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]