将行的值传播到Redshift表中的多个列上?

时间:2017-04-10 16:26:44

标签: amazon-redshift

我有一个带有以下结构的示例行的Redshift表:

id                url
12345             http://www.things.com/details/?foo=hello&bar=world&baz=John+Smith
45678             http://www.things.com/details/?foo=hello&bar=america&booz=Howard+Jones&other_field=Portugal

我想提取网址中?之后的所有内容以及每个&,然后将=左侧的值添加到密钥列,并将值添加到权利到一个值列。给定网址中没有确定数量的&。所需的输出如下:

id               key          value
12345            foo          hello
12345            bar          world
12345            baz          John+Smith
45678            foo          hello
45678            bar          america
45678            booz         Howard+Jones
45678            other_field  Portugal

我现在的解决方案是选择一个相当高的数字并编写一个Python脚本,为每个整数写一个新的UNION ALL相同的查询。我在每次迭代期间使用SPLIT_PART(SPLIT_PART(SPLIT_PART(url, '?', 2), '&', {i}), '=', 1)SPLIT_PART(SPLIT_PART(SPLIT_PART(url, '?', 2), '&', {i}), '=', 2)解析出所需的字段。

1 个答案:

答案 0 :(得分:0)

这是其他一些问题的重复:splitting rows in RedshiftSplit values over multiple rows in RedShift

我认为在Redshift中不可能轻松实现,因为AFAIK没有将单行转换为多行的功能。

我提到的相关问题也提供了一些可能有用的有用技巧。我认为最好的是加入一个序列号表(没有任何连接谓词)并将该数字用于SPLIT_PART,可能使用过滤器来消除不匹配的行。

其他一些系统具有此功能,例如: Postgres有regexp_split_to_arrayregexp_split_to_table,Snowflake有SPLIT + FLATTEN(免责声明 - 我在这个系统上工作)。