Paginar um conjunto de resultados do BigQuery

Se você está tentando recuperar os resultados de uma consulta em um conjunto de dados do BigQuery que é maior do que o limite de memória dos fluxos de trabalho, é possível usar um token de página para paginar os resultados. O token de página representa a posição no conjunto de resultados e é retornado quando há mais resultados disponíveis. Isso permite que você retorne a uma página de resultados por vez.

O BigQuery hospeda vários conjuntos de dados públicos disponíveis para consulta, em geral. No exemplo a seguir, consulte o conjunto de dados públicos do USA Data Data para determinar os nomes mais comuns nos EUA entre 1910 e 2013.

YAML

main:
  params: [input]
  steps:
  - init:
      assign:
          - pageToken: null
  - startQuery:
      call: googleapis.bigquery.v2.jobs.query
      args:
          projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
          body:
              useLegacySql: false
              # Remove LIMIT from the query to iterate through all results
              query:
                  SELECT name, SUM(number) AS total FROM `bigquery-public-data.usa_names.usa_1910_2013` GROUP BY name ORDER BY total DESC LIMIT 50
      result: query
  - getPage:
      call: googleapis.bigquery.v2.jobs.getQueryResults
      args:
          projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
          jobId: ${query.jobReference.jobId}
          maxResults: 10
          pageToken: ${pageToken}
      result: page
  - processPage:
      for:
          value: row
          in: ${page.rows}
          steps:
              - processRow:
                  call: sys.log
                  args:
                      data: ${row}
  - checkIfDone:
      switch:
          - condition: ${"pageToken" in page and page.pageToken != ""}
            assign:
              - pageToken: ${page.pageToken}
            next: getPage

JSON

{
  "main": {
    "params": [
      "input"
    ],
    "steps": [
      {
        "init": {
          "assign": [
            {
              "pageToken": null
            }
          ]
        }
      },
      {
        "startQuery": {
          "call": "googleapis.bigquery.v2.jobs.query",
          "args": {
            "projectId": "${sys.get_env(\"GOOGLE_CLOUD_PROJECT_ID\")}",
            "body": {
              "useLegacySql": false,
              "query": "SELECT name, SUM(number) AS total FROM `bigquery-public-data.usa_names.usa_1910_2013` GROUP BY name ORDER BY total DESC LIMIT 50"
            }
          },
          "result": "query"
        }
      },
      {
        "getPage": {
          "call": "googleapis.bigquery.v2.jobs.getQueryResults",
          "args": {
            "projectId": "${sys.get_env(\"GOOGLE_CLOUD_PROJECT_ID\")}",
            "jobId": "${query.jobReference.jobId}",
            "maxResults": 10,
            "pageToken": "${pageToken}"
          },
          "result": "page"
        }
      },
      {
        "processPage": {
          "for": {
            "value": "row",
            "in": "${page.rows}",
            "steps": [
              {
                "processRow": {
                  "call": "sys.log",
                  "args": {
                    "data": "${row}"
                  }
                }
              }
            ]
          }
        }
      },
      {
        "checkIfDone": {
          "switch": [
            {
              "condition": "${\"pageToken\" in page and page.pageToken != \"\"}",
              "assign": [
                {
                  "pageToken": "${page.pageToken}"
                }
              ],
              "next": "getPage"
            }
          ]
        }
      }
    ]
  }
}

A seguir