2017-02-13 18 views
0

ディレクトリの最大数に達するまで、URISのセットから「ディレクトリ変数」の作成を自動化したいと考えています。 "/A/B/C/17628.html"が、私は次の変数を作成したいと思う:BigQueryで一連の変数の作成を自動化

  1. path_1 = "A"
  2. path_2 = "B"
  3. path_3 = "C"
  4. path_4 = "17628.html"
私はURIから4つのディレクトリを持っている場合たとえば

しかし、私が持っていた場合:"/A/D/E/F/178.html"

  1. path_1 = "A"
  2. path_2 = "D"
  3. path_3 = "E"
  4. path_4 = "F"
  5. path_5 = "178.html"

それは(20まで)多くのディレクトリにURIを持っている可能性です。 これらの変数を手作業で作成しないようにするには、をforループ(または別のオプション)を使用して定義します。 BigQueryでこのループを使用できますか?

+0

'' /A/B/C/17628.html ''のURIで期待されるクエリの出力は?独自のコードで作成しない限り、列を動的に作成することはできませんが、それぞれにURIの一部が含まれる5つの行を取得する予定ですか? –

+0

私のデータセットは、最初の列にURIを持っています。クエリ出力には、列内に異なるサブディレクトリ(path1、path2 ... pathn)が必要です。 URIに1つのサブディレクトリがある場合、path2 ... pathnはnullとして入力されます。 –

+0

私はこのようなものが欲しいです(コードは正しくありません):SELECT CON(パス、i)FROM(1からMAX(LENGTH(URI)-LENGTH(REPLACE(URI、 '/'、 ''))) [my_table_URI] –

答えて

0

選択リストの列を明示的に指定する必要があります。列自身が動的であることは不可能です。あなたは配列として戻って結果を取得して大丈夫であれば、あなたはこのような何かを行うことができます:

#standardSQL 
WITH T AS (
    SELECT '/A/B/C/17628.html' AS path UNION ALL 
    SELECT '/A/D/E/F/178.html' AS path 
) 
SELECT 
    ARRAY(SELECT IFNULL(subpaths[SAFE_OFFSET(x)], '') 
     FROM UNNEST(GENERATE_ARRAY(0, 19)) AS x) AS paths 
FROM (
    SELECT SPLIT(path, '/') AS subpaths 
    FROM T 
); 

あなたはあなたができるなど、path_2path_1明示的な列たい場合:

#standardSQL 
WITH T AS (
    SELECT '/A/B/C/17628.html' AS path UNION ALL 
    SELECT '/A/D/E/F/178.html' AS path 
) 
SELECT 
    subpaths[SAFE_OFFSET(1)] AS path_1, 
    subpaths[SAFE_OFFSET(2)] AS path_2, 
    subpaths[SAFE_OFFSET(3)] AS path_3, 
    subpaths[SAFE_OFFSET(4)] AS path_4, 
    subpaths[SAFE_OFFSET(5)] AS path_5, 
    subpaths[SAFE_OFFSET(6)] AS path_6, 
    subpaths[SAFE_OFFSET(7)] AS path_7, 
    subpaths[SAFE_OFFSET(8)] AS path_8, 
    subpaths[SAFE_OFFSET(9)] AS path_9, 
    subpaths[SAFE_OFFSET(10)] AS path_10, 
    subpaths[SAFE_OFFSET(11)] AS path_11, 
    subpaths[SAFE_OFFSET(12)] AS path_12, 
    subpaths[SAFE_OFFSET(13)] AS path_13, 
    subpaths[SAFE_OFFSET(14)] AS path_14, 
    subpaths[SAFE_OFFSET(15)] AS path_15, 
    subpaths[SAFE_OFFSET(16)] AS path_16, 
    subpaths[SAFE_OFFSET(17)] AS path_17, 
    subpaths[SAFE_OFFSET(18)] AS path_18, 
    subpaths[SAFE_OFFSET(19)] AS path_19, 
    subpaths[SAFE_OFFSET(20)] AS path_20 
FROM (
    SELECT SPLIT(path, '/') AS subpaths 
    FROM T 
); 

以来の私は私の端末で簡単なワンライナーを実行した、手でそのリストを書きたくありませんでした:

for i in `seq 1 20`; do echo "subpaths[SAFE_OFFSET($i)] AS path_$i,"; done 
1

は、バージョンの下に考えてみましょう

#standardSQL 
WITH yourTable AS (
    SELECT '/A/B/C/17628.html' AS uri UNION ALL 
    SELECT '/A/D/E/F/178.html' AS uri 
) 
SELECT uri, CONCAT('path_', CAST(1 + OFFSET AS STRING)) AS pos, path 
FROM yourTable, UNNEST(SPLIT(REGEXP_EXTRACT(uri, r'/(.*)/'), '/')) path WITH OFFSET 
ORDER BY uri, OFFSET 

結果は次のとおりです。最も実用的なケースで

uri     pos  path  
/A/B/C/17628.html path_1  A  
/A/B/C/17628.html path_2  B  
/A/B/C/17628.html path_3  C  
/A/D/E/F/178.html path_1  A  
/A/D/E/F/178.html path_2  D  
/A/D/E/F/178.html path_3  E  
/A/D/E/F/178.html path_4  F  

、旋回し対こうした平坦化スキーマを持つ - まだあなた場合場合

で(クエリ)を扱うことがはるかに簡単です結果の上にピボットしたい - そのトピックに関する私の多くの答えの一つを見てください - Transpose rows into columns in BigQuery (Pivot implementation)

関連する問題