BigQuery:SPLIT()只返回一个值

Sau*_*wal 7 google-bigquery

我有一个页面URL列组件由分隔/.我试图SPLIT()在BigQuery中运行该函数,但它只给出了第一个值.我想要特定列中的所有值.

我不明白如何将Split字符串中Regexp_extract()提到的示例用于带有bigquery的多个列.

我需要类似的东西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
Run Code Online (Sandbox Code Playgroud)

Fel*_*ffa 26

2018标准SQL更新:

#standardSQL
SELECT SPLIT(path, '/')[OFFSET(0)] part1,
       SPLIT(path, '/')[OFFSET(1)] part2,
       SPLIT(path, '/')[OFFSET(2)] part3
FROM (SELECT "/a/b/aaaa?c" path)
Run Code Online (Sandbox Code Playgroud)

现在我明白你想要它们在不同的列中.

您提供的查询的替代方法:

SELECT FIRST(SPLIT(path, '/')) part1,
       NTH(2, SPLIT(path, '/')) part2,
       NTH(3, SPLIT(path, '/')) part3
FROM (SELECT "/a/b/aaaa?c" path)
Run Code Online (Sandbox Code Playgroud)

NTH(X, SPLIT(s))将提供SPLIT的Xth值.FIRST(s)是相同的NTH(1, s)

  • @FelipeHoffa,第二个查询似乎在 BigQuery 中不起作用。但第一个效果很酷! (3认同)
  • 以 SAFE 为前缀。- 或发布一个新问题;) (2认同)

Lon*_*nUK 10

您还可以使用 SPLIT 函数尝试以下操作,但是您需要知道您的 url 将有多少个“/”或进行足够的条目,以便如果您的 url 包含更多“/”,那么您仍然可以在单独的列中获取这些值

  SPLIT(`url`, '/')[safe_ordinal(1)] AS `Col1`, 
  SPLIT(`url`, '/')[safe_ordinal(2)] AS `Col2`,
  SPLIT(`url`, '/')[safe_ordinal(3)] AS `Col3`, 
  SPLIT(`url`, '/')[safe_ordinal(4)] AS `Col4`,
  .
  .
  SPLIT(`url`, '/')[safe_ordinal(N)] AS `ColN`
Run Code Online (Sandbox Code Playgroud)


Fel*_*ffa 0

这对我有用:

SELECT SPLIT(path, '/') part
FROM (SELECT "/a/b/aaaa?c" path)

Row part     
1   a    
2   b    
3   aaaa?c
Run Code Online (Sandbox Code Playgroud)

不知道为什么它对你不起作用。您的数据是什么样的?

  • 注意:如果您选择目标表并取消选中“展平结果”,您将获得带有重复部分列的单行。 (3认同)