Pyspark 铸串状;[1,2,3]”;排列

Pyspark 铸串状;[1,2,3]”;排列,pyspark,apache-spark-sql,pyspark-sql,apache-spark-2.3,Pyspark,Apache Spark Sql,Pyspark Sql,Apache Spark 2.3,很简单。我将一个类似数组的列编码为字符串(varchar),并希望将其转换为array(这样我就可以分解它并以“long”格式操作元素) 两种最自然的方法似乎不起作用: -- 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,

很简单。我将一个类似数组的列编码为字符串(
varchar
),并希望将其转换为
array
(这样我就可以
分解它并以“long”格式操作元素)

两种最自然的方法似乎不起作用:

-- 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\u replace
可以包含这两个
replace
,但是带方括号的regex总是很麻烦;
ltrim
rtrim
trim(也可以使用“[]”…)


有没有更简洁的方法?我在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]

这看起来像是纯Python代码?@MichaelChirico。它在Spark中工作吗?我认为没有比这更简洁的方法了——使用
regexp\u replace()
如中所示。在您的情况下,您可以使用:
explode(split(regexp_replace(“a”,r“(^\[))(]$),“),”,”).cast(“数组”)
@pault谢谢。。。我保证我搜索了
[apachesparksql]
标记大约20分钟,但找不到它。。。我在那里添加了
cast
以便更好地测量。不管怎样,看来我运气不好:\