web-dev-qa-db-ja.com

BigQuery:SPLIT()は1つの値のみを返します

_/_で区切られたページURL列コンポーネントがあります。 BigQueryでSPLIT()関数を実行しようとしましたが、最初の値しか得られません。特定の列のすべての値が必要です。

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
_
7
Saumil Agrawal

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)
_

今、私はあなたがそれらを別の列に入れたいと理解しています。

指定したクエリの代替:

_SELECT FIRST(SPLIT(path, '/')) part1,
       NTH(2, SPLIT(path, '/')) part2,
       NTH(3, SPLIT(path, '/')) part3
FROM (SELECT "/a/b/aaaa?c" path)
_

NTH(X, SPLIT(s))は、SPLITからX番目の値を提供します。 FIRST(s)NTH(1, s)と同じです

29
Felipe Hoffa

標準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 "/a/b/aaaa?c" path)

part2   part2_again part3    
a       a           b

part1この場合、空の文字列(最初のスラッシュの前)

1
marengaz

ある方法で解決しました。

   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
0
Saumil Agrawal

これは私にとってはうまくいきます:

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

Row part     
1   a    
2   b    
3   aaaa?c

なぜうまくいかないのかわからない。データはどのように見えますか?

0
Felipe Hoffa

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`
0
LondonUK