2017-03-09 2 views
3

いくつかの最も内側のレベルのオブジェクト値がオブジェクトの配列であるいくつかの大きなjsonオブジェクト(GBスケールと考える)があります。私はjq 1.4を使用しています。これらの配列を個々のオブジェクトに分割しようとしています。それぞれには、keys関数によって返された元の配列のインデックスに対応するg__0やg__1などのキーがあります。各配列内のオブジェクトの数は、任意に大きくすることができます(私の例では3に等しい)。それと同時に、残りの構造を維持したい。jq:オブジェクトの配列を個々のオブジェクトに変換し、各配列インデックスを新しいキーとして使用する

元の構造はMongoDBから得られる価値がありますが、このレベルで変更することはできません。次に、このjsonファイルを使用してBigQuery用のスキーマを作成します。例の列はseeds.g__1.guidとなります。私が持っているもの

{ 
    "port": 4500, 
    "notes": "This is an example", 
    "seeds": { 
    "g__0": { 
     "seed": 12, 
     "guid": "eaf612" 
    }, 
    "g__1": { 
     "seed": 23, 
     "guid": "bea143" 
    }, 
    "g__2": { 
     "seed": 38, 
     "guid": "efk311" 
    } 
    } 
} 

感謝を:私は達成するために期待しています何

{ 
"port": 4500, 
"notes": "This is an example", 
"seeds": [ 
    { 
    "seed": 12, 
    "guid": "eaf612" 
    }, 
    { 
    "seed": 23, 
    "guid": "bea143" 
    }, 
    { 
    "seed": 38, 
    "guid": "efk311" 
    } 
    ] 
} 

答えて

1

次JQプログラムは、トリックを行う必要があります。少なくとも、指定されたJSONに対して望ましい結果が得られます。プログラムはとても短くて簡単ですので、私はそれ自体のために話しましょう:

def array2object(prefix): 
    . as $in 
    | reduce range(0;length) as $i ({}; .["\(prefix)_\($i)"] = $in[$i]); 

.seeds |= array2object("g__") 
+0

おかげさまで、私はこれを数種類のシナリオに対して試しましたが、いつもうまく機能していました。 – adaris

1

だから、あなたは基本的に(ピボット)のBigQuery表でデータを移調したい、そのような代わり

enter image description here

次のように行のデータを有していると、あなたは以下のように列のデータを持っていることを


で開始することであるよう enter image description here

はこのように、私の推薦は、あなたのデータをロードし、
ファーストだろうこれで、BigQuery以外のスキーマ変換を行うのではなく、BigQueryでスキーマ変換を行うようにしましょう!

以下

あなたは(あなたが配列に最大3つの項目/オブジェクトを持っていると仮定)を探している変革を実現する方法の一例だろう

#standardSQL 
SELECT 
    port, notes, 
    STRUCT(
    seeds[SAFE_OFFSET(0)] AS g__0, 
    seeds[SAFE_OFFSET(1)] AS g__1, 
    seeds[SAFE_OFFSET(2)] AS g__2 
) AS seeds 
FROM yourTable 

あなたは以下のようなCTEを使用してダミーデータでこれをテストすることができますあなたは、種子配列にアイテム/オブジェクトの最大数を知っていれば

#standardSQL 
WITH yourTable AS (
    SELECT 
    4500 AS port, 'This is an example' AS notes, 
    [STRUCT<seed INT64, guid STRING> 
     (12, 'eaf612'), (23, 'bea143'), (38, 'efk311') 
    ] AS seeds 
    UNION ALL SELECT 
    4501 AS port, 'This is an example 2' AS notes, 
    [STRUCT<seed INT64, guid STRING> 
     (42, 'eaf412'), (53, 'bea153') 
    ] AS seeds 
) 
SELECT 
    port, notes, 
    STRUCT(
    seeds[SAFE_OFFSET(0)] AS g__0, 
    seeds[SAFE_OFFSET(1)] AS g__1, 
    seeds[SAFE_OFFSET(2)] AS g__2 
) AS seeds 
FROM yourTable 

だから、技術的には、 - あなただけ手動で実際のデータに対してそれを実行するために、必要なSQL文を書くことができます。
はあなたがスクリプト/プロセスを自動化することができます。もちろん、アイデア

を得たホープ - あなたはここで同様のピボットタスクの例を見つけることができます。

https://stackoverflow.com/a/40766540/5221944
https://stackoverflow.com/a/42287566/5221944

+0

返信Mikhailのために多くのありがとう。私の場合、私の場合、配列内のアイテム/オブジェクトの最大数を知ることは難しいので(私はまたそのような配列の任意の数を持っています)、私はあなたの答えを選んでいないので、行データを操作する方が望ましいことがわかります。これはBigQueryレベルの優れたアプローチですが、私は同意します。 – adaris

関連する問題