Bigquery使用UNNEST提取嵌套的JSON

时间:2018-10-30 11:19:10

标签: google-cloud-platform google-bigquery

我在Bigquery中有一个表,该表具有如下所示的JSON数据。

{
    "block_id": "000000000000053d90510fa4bbfbbed243baca490c85ac7856b1a1fab4d367e4",
    "transactions": [
      {
        "transaction_id": "4529b00ed3315ff85408118ef5992b3ad2b47f4c1c088cc3dea46084bdb600df",
        "inputs": [
          {
            "input_script_bytes": "BIvbBRoDwAgBEi9QMlNIL0JJUDE2L3NsdXNoL1Is+r5tbf4lsR1tDNnUOZk9JGzN4MkWc914Rol/+47Hn+msUG/nAQAAAAAAAAA=",
            "input_pubkey_base58_error": null
          }
        ],
        "outputs": [
          {
            "output_satoshis": "5048296000",
            "output_pubkey_base58_error": "Cannot cast this script to a pay-to-address type"
          }
        ]
      },
      {
        "transaction_id": "838b03a6f741c844e22079cdb0d1401b9687d65a82f355ccb0a993b042c49d54",
        "inputs": [
          {
            "input_script_bytes": "RzBEAiAE5fM2NHAEaWy9utrC2ypHQsKwUDeUTp/gjbj5tSy3lwIgUXXFcuwXhr3tx1m5D+kznhklTAK9+YYHRcB43aXTAZ8BQQR86qInfhczeYqqJsAD9yFfxSAzBAmIBlxk/bpTQSxgLkF4Ttipiuuoxt6TTVMDK/eewwFhAPJiHrvZq0psKI1d",
            "input_pubkey_base58_error": null
          }
        ],
        "outputs": [
          {
            "output_satoshis": "1",
            "output_pubkey_base58_error": null
          },
          {
            "output_satoshis": "4949999",
            "output_script_bytes": "dqkU4E0i4TQg1I6OpprIt6v7Ipuda/GIrA==",
            "output_pubkey_base58_error": null
          }
        ]
      }
    ]
}

我想从此表中提取transaction_idoutput.input_pubkey_base58_error

如何使用UNNEST做到这一点? 您可以参考上面的示例代码。

2 个答案:

答案 0 :(得分:2)

看起来sintax应该是这样的。 (没有尝试!)。猜测您的表在bigquery中称为mybitcoindata

SELECT block_id, output.output_pubkey_base58_error
FROM yourdataset.yourtable as A
CROSS JOIN UNNEST(A.transactions) AS transaction
CROSS JOIN UNNEST(transaction.outputs) AS output
;

有很好的例子here

编辑: 刚刚测试。如果将json数据转换为单行json,则可以在bigquery中创建表。上面的查询可以爆炸多个数组。

答案 1 :(得分:1)

首先,我想澄清一下,您说您对字段transaction_idoutput.input_pubkey_base58_error感兴趣,但是根据表模式,后者并不存在(也许您指的是inputs.input_pubkey_base58_erroroutputs.output_pubkey_base58_error)。因此,我认为您有必要弄清楚场景和/或用例。

在任何情况下,使用您提到的the public Bitcoin dataset,都可以使用以下查询,以便仅查询(使用标准SQL)感兴趣的字段。

#standardSQL
SELECT
  tr.transaction_id,
  inp.input_pubkey_base58_error,
  out.output_pubkey_base58_error
FROM
  `bigquery-public-data.bitcoin_blockchain.blocks`,
  UNNEST(transactions) AS tr,
  UNNEST(tr.inputs) AS inp,
  UNNEST(tr.outputs) as out
LIMIT
  100

在此查询中,我使用UNNEST StandardSQL operator来查询数组中的特定字段,但是我强烈建议您仔细阅读该文档,以了解有关如何操作的更多详细信息和特定示例。可以。