2014-11-21 259 views
3

我有一個頁面URL列的組成部分由/分隔。我嘗試在BigQuery中運行SPLIT()函數,但它只提供第一個值。我想要特定列中的所有值。BigQuery:SPLIT()只返回一個值

我不明白如何使用Split string into multiple columns with bigquery中提到的Regexp_extract()示例。

我需要類似於REGEX_SPLIT_TO_TABLE(<String>, <DELIMITER>)這將一個字符串轉換爲多個列。

查詢:

SELECT PK, 
DATE(TIMESTAMP(CONCAT(SUBSTR(date,1,4),'-',SUBSTR(date,5,2),'-',SUBSTR(date,7,2),' 00:00:00'))) as visit_date, 
hits_page_pagePath, 
split(hits_page_pagePath,'/') 
FROM [Intent.All2mon] limit 100 
+0

數據是什麼樣的? – 2014-11-21 12:20:22

+0

嗨Felipe,你能幫我理解如何準備正則表達式來提取'/'符號中每個實體的信息嗎? – 2014-11-21 14:10:41

+0

您無法在BigQuery中生成可變數量的列,只有恆定數量的列,因此您無法完全按照自己的想法進行操作。如果您可以設置URL組件數量的上限,那麼您可以生成很多列,並在特定URL具有較少組件時使它們爲NULL。 – sprocket 2014-11-22 19:19:16

回答

0

這個工作對我來說:

SELECT SPLIT(path, '/') part 
FROM (SELECT "https://stackoverflow.com/a/b/aaaa?c" path) 

Row part  
1 a  
2 b  
3 aaaa?c 

不知道爲什麼它不會爲你工作。你的數據是什麼樣的?

+0

//<字符串/ /... – 2014-11-21 12:55:13

+0

它需要被分成列.... 2014-11-21 12:55:34

+1

SPLIT()拆分列值爲行不添加ROW_NUMBER反對。 – 2014-11-21 13:49:48

1

解決它的方式。

SELECT 
    date, 
    hits_time, 
    fullVisitorId, 
    visitNumber, 
    hits_hitNumber, 
    X.page_path, 
    REGEXP_EXTRACT(X.page_path,r'/(\w*)\/') as one, 
    REGEXP_EXTRACT(X.page_path,r'/\w*\/(\w*)') as two, 
    REGEXP_EXTRACT(X.page_path,r'/\w*\/\w*\/(\w*)') as three, 
    REGEXP_EXTRACT(X.page_path,r'/\w*/\w*/\w*\/(\w*)\/.*') as four 
    from 
    (
    select 
    date, hits_time, fullVisitorId, visitNumber, hits_hitNumber, 
    REGEXP_REPLACE (hits_page_pagePath, '-', '') as page_path 
    from 
    [Intent.All2mon] 
    ) X 
    limit 1000 
11

現在我明白你想要他們在不同的列。

給你提供的查詢的另一種:

SELECT FIRST(SPLIT(path, '/')) part1, 
     NTH(2, SPLIT(path, '/')) part2, 
     NTH(3, SPLIT(path, '/')) part3 
FROM (SELECT "https://stackoverflow.com/a/b/aaaa?c" path) 

NTH(X, SPLIT(s))將提供從SPLIT第十屆值。 FIRST(s)相同NTH(1, s)

0
標準SQL

,您可以使用以下功能:

array[OFFSET(zero_based_offset)] 
array[ORDINAL(one_based_ordinal)] 

所以

SELECT SPLIT(path, '/')[OFFSET(1)] part2, 
     SPLIT(path, '/')[ORDINAL(2)] part2_again, 
     SPLIT(path, '/')[ORDINAL(3)] part3 
FROM (SELECT "https://stackoverflow.com/a/b/aaaa?c" path) 

part2 part2_again part3  
a  a   b 

在這種情況下part1,爲空字符串(第一個斜槓前)