在 Presto SQL 中将 varchar 转换为数组

convert varchar to array in presto sql

提问人:Nini 提问时间:8/25/2023 更新时间:8/25/2023 访问量:191

问:

我想在 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

但是没有分隔符,所以拆分功能不起作用。 是否有任何函数可以将字符串更改为数组(或列表)? 谢谢。

sql 数组字符串 hive presto

评论


答:

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]