2016-01-11 10 views
5

BigQueryで繰り返しレコード列を作成することはできますか?たとえば、次のデータの場合:BigQuery creat繰り返しレコードフィールド

| a | b | c | 
------------- 
| 1 | 5 | 2 | 
------------- 
| 1 | 3 | 1 | 
------------- 
| 2 | 2 | 1 | 

以下は可能ですか?

Select a, NEST(b, c) as d from *table* group by a 

次のような結果

| a | d.b | d.c | 
----------------- 
| 1 | 5 | 2 | 
----------------- 
| | 3 | 1 | 
----------------- 
| 2 | 2 | 1 | 
+0

Use Legacy SQLチェックボックスをオフにする - それらのいずれかを共有したいと思った - 私は比較的新しいユーザーがSO(ほんの数ヶ月ここに)ので、まだその周りにいくつかのルールを学習するために午前:最初の 'あなたがすべきことあなたの質問に対する誰かの答えを読んでいるのは、(十分な評判を持っている)他のユーザーのように、答えに対する投票です。有益な回答を投票してください。もっとたくさんあります...誰かがあなたの質問に答えるときに何をすべきかを確認することができます - http://stackoverflow.com/help/someone-answers。ちょうどあなたがアイデアが好きな場合に分かちたいと思った:o) –

答えて

6

NEST()「入れ子」の制限は、BigQuery User-Defined Functionsを使用することです。彼らは非常に強力ですが、まだ認識しているのはLimitsLimitationsです。そして、私の将来の最も重要なのは心の中で持っている - 彼らは非常に大規模なコンピューティングリソースに処理されたバイト数に 相対を消費することができ、高価なHigh-Compute queries

複雑なクエリとして認定されているため、非常候補です。通常、そのようなクエリ には非常に多数のJOINまたはCROSS JOIN句が含まれています。また、複雑なユーザー定義関数もあります。

SELECT a, d.b, d.c FROM 
JS((  // input table 
    SELECT a, NEST(CONCAT(STRING(b), ',', STRING(c))) AS d 
    FROM (
    SELECT * FROM 
    (SELECT 1 AS a, 5 AS b, 2 AS c), 
    (SELECT 1 AS a, 3 AS b, 1 AS c), 
    (SELECT 2 AS a, 2 AS b, 1 AS c) 
) GROUP BY a), 
    a, d,  // input columns 
    "[{'name': 'a', 'type': 'INTEGER'}, // output schema 
    {'name': 'd', 'type': 'RECORD', 
    'mode': 'REPEATED', 
    'fields': [ 
     {'name': 'b', 'type': 'STRING'}, 
     {'name': 'c', 'type': 'STRING'} 
    ]  
    } 
    ]", 
    "function(row, emit){ // function 
    var c = []; 
    for (var i = 0; i < row.d.length; i++) { 
     x = row.d[i].toString().split(','); 
     t = {b:x[0], c:x[1]} 
     c.push(t); 
    }; 
    emit({a: row.a, d: c}); 
    }" 
) 

は比較的簡単である:

したがって、以下の例では、 "模倣" NEST(B、C)の例からquestinoにすることです。

をどんなにあなたが繰り返し/ネストされたフィールドを持つレコードを作成する方法 - BigQueryの が自動的にクエリ結果を平坦化するので、目に見える結果を:覚えていない - 私はあなたがそれを歩くとアイデアまだ

を取得することができます願っています繰り返しフィールドが には含まれません。同じ照会ですぐに使用できるように中間結果を生成する副選択として を使用する必要があります。 FYI

、あなたは

SELECT COUNT(1) AS rows FROM (
    <above query here> 
) 

クエリの下にもう一つの重要な注意を実行して(それが平坦化されたときに、それがどのように見えるされていない3)上記のリターンは2つだけを記録することを自分のために証明することができます。
NEST()UnFlatten Resultsと互換性がありません。ほとんどの場合、出力はサブクエリの中間結果に使用されます。
対照的に、ソリューションの上に容易にBigQuery標準SQLの導入により

+0

重要なので、投票の下に投稿された回答の左側にあるチェックマークを使用して、受け入れられた回答をマークすることができます。それが重要な理由については、http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235を参照してください。 –

0

のBigQueryは自動的にクエリ結果を平坦化するので、あなたはトップレベルのクエリにNEST 機能を使用する場合、結果が繰り返し フィールドが含まれませんを生成するために。 中間結果を生成する副選択を使用して同じ照会で即時使用する場合は、NEST機能を使用します。

Big Query - Group By Clause not working with NEST()をチェックhttps://cloud.google.com/bigquery/query-reference#aggfunctions

でNEST()についての詳細を参照してくださいとしてFYI

心の中で持っているもう一つのポイント - ヨーヨーができNEST唯一のフィールド - NEST(b)なくNEST(b, c)

をそのあなたが尋ねたものと似た結果を生み出すことができますが、それをテーブルに書く必要があります。

より私の経験:ユーザーはBigQueryにデータをロードする際にこの問題に直面しています。つまり、ユーザーは必要に応じて複雑なスキーマとしてnlJSONを使用できます。 GBQ自体では、通常、分析にもっと関心がありますので、タイプ質問以上の集約はそれほど頻繁に起きません。私は現在のGBQのsysntaxは、 "複雑な"階層/ネストされたスキーマのデータを生成し、テーブルにGBQだけを挿入するのに十分なフレキシブルではないと思います。それでも、回避策は可能だと思いますが、特定のユースケースに依存します。

+0

複数のフィールドを入れ子にすることは、私が実際に求めていることです。 – Fardream

+1

残念ながら、 'NEST(b)'は現在サポートされていません。素晴らしいことだ!あなたの提案を提出することができます –

4

(チェック平ら結果で)テーブルに直接保存することができ、我々は以下試したレコード
に対処するための簡単な方法を持っている、は忘れてはいけませんあなたのよう表示オプション

WITH YourTable AS (
    SELECT 1 AS a, 5 AS b, 2 AS c UNION ALL 
    SELECT 1 AS a, 3 AS b, 1 AS c UNION ALL 
    SELECT 2 AS a, 2 AS b, 1 AS c 
) 
SELECT a, ARRAY_AGG(STRUCT(b, c)) AS d 
FROM YourTable 
GROUP BY a 
関連する問題