2014-11-21 200 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,为空字符串(第一个斜杠前)