2017-04-10 45 views
0

我有一個例子的紅移表結構如下行:將行的值分佈在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 

我想提取的URL和每個&?後的一切,在=左側的添加值一個鍵列和value列右邊的值。在給定的URL中沒有確定的數字&。所需的輸出如下:

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 

我的解決方案,現在是挑一個相當高的數字和編寫與每個整數新UNION ALL寫入相同的查詢Python腳本。我在每次迭代期間使用SPLIT_PART(SPLIT_PART(SPLIT_PART(url, '?', 2), '&', {i}), '=', 1)SPLIT_PART(SPLIT_PART(SPLIT_PART(url, '?', 2), '&', {i}), '=', 2)解析出所需的字段。

+0

Redshift是否有'regexp_split_to_table()'? –

+0

[不,不。](http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-functions.html) –

回答

0

這是幾個其他問題的複本:splitting rows in Redshift,Split values over multiple rows in RedShift

我不認爲它很容易在Redshift中使用,因爲AFAIK它沒有將單行轉換爲多行的函數。

我提到的相關問題也提供了一些有用的技巧,可能有所幫助。我認爲最好的方法是加入一個序號表(沒有任何連接謂詞)並使用該號碼作爲SPLIT_PART,可能使用過濾器來消除不匹配的行。

一些其他系統具有用於該功能的功能,例如, Postgres有regexp_split_to_arrayregexp_split_to_table,Snowflake有SPLIT + FLATTEN(免責聲明 - 我在這個系統上工作)。

相關問題