2016-08-21 14 views
0

データが入れ子になった配列を持つJSON形式です。ここでの例は次のとおりネストされた配列をbigqueryにロード

"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963],... 

サブアレイの長さは、3又は4であることができ、最初の数は、データタイプ(約30の異なるものが存在する)です。辞書のレコードに変換せずにこのデータをbigQueryにロードする方法はありますか?

おかげで、 ヤロン

--EDIT--

回避策を持っているthis質問が、ありますが、固定長の部分配列がそこにあるので、私は推測は適用されません。..

+0

最終的な表がどのように予期されるのか明確ではありません。 –

+0

重要なので、投票の下に投稿された回答の左側にあるチェックマークを使用して、受け入れられた回答に印を付けることができます。 http://meta.stackexchangeを参照してください。com/questions/5234/how-does-a-answer-work-work#5235が重要である理由について説明します。答えに投票することも重要です。役に立った答えを投票してください。もっとたくさんあります...誰かがあなたの質問に答えるときに何をすべきかを確認することができます - http://stackoverflow.com/help/someone-answers。 –

答えて

0

配列の配列を直接ロードすることはできません。内部レベルの配列をラップするためにレコードを使用する必要があります。標準的なSQLのリファレンスは、これに触れています(データ自体はロードしませんが、データをロードしません):https://cloud.google.com/bigquery/sql-reference/arrays#building-arrays-of-arrays

+0

あなたの答えをありがとう。私は、レコード/構造体に変換するためにデータを変換する必要がないようにしようとしています。このネストされた配列を文字列/テキストのBLOBとしてアップロードする方法はありますか? – WeaselFox

+0

この過去の質問は役に立ちます:http://stackoverflow.com/questions/37660579/bigquery-create-column-of-json-datatype文字列としてロードしてから、BigQueryのJSON関数を使用して必要な部分を抽出しますクエリの一部として –

1

それはあなたの最終的な目標が何であるかを完全に明らかではないとして、間違った方向であってもよいが、私はあなたにどういうわけか
を支援してみましょうかもしれませんが、私はあなたの先テーブルが

type metric1 metric2 metric3 
    1  1271  518  945 
    1  1287  495  963 
以下のようなものであることが期待される感じただ一つのフィールドにCSVなどのデータをロードする - -

だから、私の勧告は2つの段階

ステップ1であなたのそれを作るためにあるのは、フィールドdata

とテーブル theTableをしましょう
       data 
{"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963]]}} 
{"data": {"events": [[2, 111, 222, 333], [3, 444, 555, 666], [4, 777, 888, 999]]}} 

ステップ2 - 期待されるスキーマを生成するためのプロセスtheTable(解答の上を参照)、最終的なテーブルに保存します。この特定のクエリが7サブアレイまでサポートしていますが、減少または変更することでこれを増やすことができます - あなたが見ることができるように結果が

type metric1 metric2 metric3 
    1  1271  518  945 
    1  1287  495  963 
    2  111  222  333 
    3  444  555  666 
    4  777  888  999 

になります。この

SELECT 
    NTH(1, SPLIT(y)) AS type, 
    NTH(2, SPLIT(y)) AS metric1, 
    NTH(3, SPLIT(y)) AS metric2, 
    NTH(4, SPLIT(y)) AS metric3, 
FROM (
    SELECT 
    REPLACE(REPLACE(COALESCE(y0, y1, y2, y3, y4, y5, y6), '[', ''), ']', '') AS y 
    FROM (
    SELECT 
     IF(k=0, JSON_EXTRACT(data, '$.data.events[0]'), NULL) AS y0, 
     IF(k=1, JSON_EXTRACT(data, '$.data.events[1]'), NULL) AS y1, 
     IF(k=2, JSON_EXTRACT(data, '$.data.events[2]'), NULL) AS y2, 
     IF(k=3, JSON_EXTRACT(data, '$.data.events[3]'), NULL) AS y3, 
     IF(k=4, JSON_EXTRACT(data, '$.data.events[4]'), NULL) AS y4, 
     IF(k=5, JSON_EXTRACT(data, '$.data.events[5]'), NULL) AS y5, 
     IF(k=6, JSON_EXTRACT(data, '$.data.events[6]'), NULL) AS y6, 
    FROM theTable AS a 
    CROSS JOIN (
     SELECT k FROM (SELECT 0 AS k), (SELECT 1 AS k), (SELECT 2 AS k), 
     (SELECT 3 AS k), (SELECT 4 AS k), (SELECT 5 AS k), (SELECT 6 AS k) 
    ) AS b 
) 
    HAVING NOT y IS NULL 
) 

のクエリの下に使用することができます

#1

REPLACE(REPLACE(COALESCE(y0, y1, y2, y3, y4, y5, y6), '[', ''), ']', '') AS y  

#2

0三箇所のコード最後に
IF(k=0, JSON_EXTRACT(data, '$.data.events[0]'), NULL) AS y0, 
IF(k=1, JSON_EXTRACT(data, '$.data.events[1]'), NULL) AS y1, 
IF(k=2, JSON_EXTRACT(data, '$.data.events[2]'), NULL) AS y2, 
IF(k=3, JSON_EXTRACT(data, '$.data.events[3]'), NULL) AS y3, 
IF(k=4, JSON_EXTRACT(data, '$.data.events[4]'), NULL) AS y4, 
IF(k=5, JSON_EXTRACT(data, '$.data.events[5]'), NULL) AS y5, 
IF(k=6, JSON_EXTRACT(data, '$.data.events[6]'), NULL) AS y6, 

#3

SELECT k FROM (SELECT 0 AS k), (SELECT 1 AS k), (SELECT 2 AS k), 
(SELECT 3 AS k), (SELECT 4 AS k), (SELECT 5 AS k), (SELECT 6 AS k) 

、ワット/実際のデータをロードするO、ちょうど変換ロジックをテストする - あなたは、これが便利だったホープ・

スクリプト以下
SELECT 
    NTH(1, SPLIT(y)) AS type, 
    NTH(2, SPLIT(y)) AS metric1, 
    NTH(3, SPLIT(y)) AS metric2, 
    NTH(4, SPLIT(y)) AS metric3, 
FROM (
    SELECT 
    REPLACE(REPLACE(COALESCE(y0, y1, y2, y3, y4, y5, y6), '[', ''), ']', '') AS y 
    FROM (
    SELECT 
     IF(k=0, JSON_EXTRACT(data, '$.data.events[0]'), NULL) AS y0, 
     IF(k=1, JSON_EXTRACT(data, '$.data.events[1]'), NULL) AS y1, 
     IF(k=2, JSON_EXTRACT(data, '$.data.events[2]'), NULL) AS y2, 
     IF(k=3, JSON_EXTRACT(data, '$.data.events[3]'), NULL) AS y3, 
     IF(k=4, JSON_EXTRACT(data, '$.data.events[4]'), NULL) AS y4, 
     IF(k=5, JSON_EXTRACT(data, '$.data.events[5]'), NULL) AS y5, 
     IF(k=6, JSON_EXTRACT(data, '$.data.events[6]'), NULL) AS y6, 
    FROM (
    SELECT data FROM 
     (SELECT '{"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963]]}}' AS data), 
     (SELECT '{"data": {"events": [[2, 111, 222, 333], [3, 444, 555, 666], [4, 777, 888, 999]]}}' AS data) 
    ) AS a 
    CROSS JOIN (
     SELECT k FROM (SELECT 0 AS k), (SELECT 1 AS k), (SELECT 2 AS k), 
     (SELECT 3 AS k), (SELECT 4 AS k), (SELECT 5 AS k), (SELECT 6 AS k) 
    ) AS b 
) 
    HAVING NOT y IS NULL 
) 

を使用することができます!

+0

素晴らしい論理と努力のためのUpvote – BigDaddy

関連する問題