我有一个带有以下结构的示例行的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)
解析出所需的字段。
答案 0 :(得分:0)
这是其他一些问题的重复:splitting rows in Redshift,Split values over multiple rows in RedShift。
我认为在Redshift中不可能轻松实现,因为AFAIK没有将单行转换为多行的功能。
我提到的相关问题也提供了一些可能有用的有用技巧。我认为最好的是加入一个序列号表(没有任何连接谓词)并将该数字用于SPLIT_PART
,可能使用过滤器来消除不匹配的行。
其他一些系统具有此功能,例如: Postgres有regexp_split_to_array
和regexp_split_to_table
,Snowflake有SPLIT
+ FLATTEN
(免责声明 - 我在这个系统上工作)。