2017-03-09 62 views
3

我有幾個較大的json對象(想象GB縮放),其中最內層的對象值是對象數組。我正在使用jq 1.4,我試圖將這些數組分解爲單個對象,每個對象都有一個鍵,如g__0或g__1,其中數字對應於原始數組中的索引,如keys函數所返回的那樣。每個數組中的對象數量可以是任意大的(在我的例子中它等於3)。同時我想保留其餘的結構。jq:將一個對象數組轉換爲單個對象並將每個數組索引用作新鍵

爲什麼它的價值來自於MongoDB的原始結構,但我無法在這個級別上改變它。然後,我將使用此json文件爲BigQuery創建架構,其中示例列將爲seeds.g__1.guid等。

我有什麼:

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

我所希望達到:

{ 
    "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" 
    } 
    } 
} 

謝謝!

回答

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之外做模式轉換!

下面將如何實現你正在尋找轉型的例子(假設你已經在陣列最多三個項目/對象)

#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

非常感謝您的答覆米哈伊爾。我沒有選擇你的答案,因爲在我的情況下,很難知道我的數組中的項目/對象的最大數量(並且我也有任意數量的這樣的數組),所以我發現最好操縱行數據。我同意這是BigQuery級別的一個好方法。 – adaris

相關問題