红移.将逗号分隔的值转换为行

Yur*_*sky 27 amazon-redshift

我想知道如何将逗号分隔的值转换为Redshift中的行.我担心我自己的解决方案不是最优的.请指教.我有一个表与其中一个具有逗号分隔值的列.例如:

我有:

user_id|user_name|user_action
-----------------------------
1      | Shone   | start,stop,cancell...
Run Code Online (Sandbox Code Playgroud)

我想看看

user_id|user_name|parsed_action 
------------------------------- 
1      | Shone   | start        
1      | Shone   | stop         
1      | Shone   | cancell      
....
Run Code Online (Sandbox Code Playgroud)

Bob*_*ley 26

对现有答案的略微改进是使用第二个"数字"表来枚举所有可能的列表长度,然后使用a cross join来使查询更紧凑.

Redshift没有一个简单的方法来创建我所知道的数字表,但是我们可以使用https://www.periscope.io/blog/generate-series-in-redshift-and-中的一些黑客攻击.mysql.html使用行号创建一个.

具体来说,如果我们假设行数cmd_logs大于列中的最大逗号数user_action,我们可以通过计算行来创建数字表.首先,我们假设user_action列中最多有99个逗号:

select 
  (row_number() over (order by true))::int as n
into numbers
from cmd_logs
limit 100;
Run Code Online (Sandbox Code Playgroud)

如果我们想得到花哨,我们可以从cmd_logs表中计算逗号的数量,以创建更精确的行集numbers:

select
  n::int
into numbers
from
  (select 
      row_number() over (order by true) as n
   from cmd_logs)
cross join
  (select 
      max(regexp_count(user_action, '[,]')) as max_num 
   from cmd_logs)
where
  n <= max_num + 1;
Run Code Online (Sandbox Code Playgroud)

一旦有numbers桌子,我们可以做:

select
  user_id, 
  user_name, 
  split_part(user_action,',',n) as parsed_action 
from
  cmd_logs
cross join
  numbers
where
  split_part(user_action,',',n) is not null
  and split_part(user_action,',',n) != '';
Run Code Online (Sandbox Code Playgroud)


San*_*ane -7

您可以尝试复制命令将文件复制到 redshift 表中

copy table_name from 's3://mybucket/myfolder/my.csv' CREDENTIALS 'aws_access_key_id=my_aws_acc_key;aws_secret_access_key=my_aws_sec_key' delimiter ','
Run Code Online (Sandbox Code Playgroud)

您可以使用分隔符“,”选项。

有关复制命令选项的更多详细信息,您可以访问此页面

http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html