Bigquery извлекает вложенный JSON с помощью UNNEST - PullRequest
0 голосов
/ 30 октября 2018

У меня есть таблица в 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_id, output.input_pubkey_base58_error из этой таблицы.

Как этого добиться, используя UNNEST? Вы можете сослаться на приведенный выше пример кода.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Прежде всего, я хотел бы уточнить, что вы сказали, что вас интересуют поля transaction_id и output.input_pubkey_base58_error, но последнее не существует в соответствии со схемой таблицы (возможно, вы имели в виду inputs.input_pubkey_base58_error или outputs.output_pubkey_base58_error). Поэтому я считаю, что стоит уточнить свой сценарий и / или вариант использования.

В любом случае, работая с общедоступным набором данных Биткойн , который вы упомянули, вы можете использовать запрос, подобный приведенному ниже, для запроса (с использованием стандартного 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 для запроса определенных полей внутри массива, но я настоятельно рекомендую вам просмотреть документацию, чтобы увидеть больше подробности и конкретные примеры того, как это работает.

0 голосов
/ 30 октября 2018

Похоже, синтаксис должен быть таким. (Не пробовал!). Догадываясь, что ваша таблица называется mybitcoindata в bigquery

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
;

Есть очень хорошие примеры здесь

EDIT: Только что протестировано. Если вы преобразуете свои данные JSON в однострочную JSON, вы можете создать таблицу в BigQuery. Приведенный выше запрос работает для взрыва нескольких массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...