提问人:Nini 提问时间:8/25/2023 更新时间:8/25/2023 访问量:191
在 Presto SQL 中将 varchar 转换为数组
convert varchar to array in presto sql
问:
我想在 varchar 列上获得 jaccard 相似性 有两列 varchar(string)
我想将如下所示的列值从 apple (varchar) 更改为 [a,p,p,l,e](数组)
select
column
,split(column,',') as column_array
,split(column, '') as column_array2
from sample_table
但是没有分隔符,所以拆分功能不起作用。 是否有任何函数可以将字符串更改为数组(或列表)? 谢谢。
答:
0赞
prabu naresh
8/25/2023
#1
如果您使用的是支持正则表达式的数据库,则可以使用 regexp_split_to_array 函数将字符串拆分为字符数组。
SELECT
column,
regexp_split_to_array(column, '') AS column_array
FROM
sample_table;
如果不支持正则表达式,则需要使用循环或用户定义的函数。
CREATE OR REPLACE FUNCTION string_to_array_of_chars(input_str VARCHAR)
RETURNS VARCHAR[] AS $$
DECLARE
char_array VARCHAR[] := '{}';
i INT;
BEGIN
FOR i IN 1..LENGTH(input_str) LOOP
char_array := array_append(char_array, SUBSTRING(input_str FROM i FOR 1));
END LOOP;
RETURN char_array;
END;
$$ LANGUAGE plpgsql;
SELECT
column,
string_to_array_of_chars(column) AS column_array
FROM
sample_table;
您可以使用不需要正则表达式或用户定义函数的解决方法,实现在 Presto 中将 VARCHAR 列转换为字符数组的目标。以下是使用数字表的方法
创建数字表:如果您没有数字表,请创建一个 使用包含连续数字的单个列。
拆分字符:使用数字表模拟将 VARCHAR 列的每个
字符拆分为数组。创建表编号 (num INT); 在数字中插入值 (1)、(2)、(3)、...;
-- Split Characters SELECT st.column, ARRAY_AGG(SUBSTRING(st.column FROM n.num FOR 1)) AS column_array FROM sample_table st CROSS JOIN numbers n WHERE n.num <= LENGTH(st.column) GROUP BY st.column;
评论
0赞
Nini
8/25/2023
似乎 Presto 不支持regexp_split_to_array :(
0赞
Nini
8/25/2023
而且,我使用 zepplin 作为解释器,似乎它也不支持 udf。:(
0赞
prabu naresh
8/25/2023
您可以使用不需要正则表达式或用户定义函数的解决方法,实现在 Presto 中将 VARCHAR 列转换为字符数组的目标。以下是使用数字表执行此操作的方法,请参阅编辑后的代码
0赞
Nini
8/25/2023
#2
哦,我尝试regexp_replace如下所示的功能,它有效!
array_remove(array_remove(split(regexp_replace(column,'', ','),','), ' '),'')
0赞
Guru Stron
8/25/2023
#3
您可以尝试使用模式(匹配任何字符(行终止符除外)):regexp_extract_all
.
select regexp_extract_all('apple', '.');
输出:
_col0
-----------------
[a, p, p, l, e]
评论