Paginer un ensemble de résultats BigQuery

Si vous essayez de récupérer les résultats d'une requête dans un ensemble de données BigQuery dont la taille est supérieure à la limite de mémoire de Workflows, vous pouvez utiliser un jeton de page pour paginer les résultats. Le jeton de page représente la position dans l'ensemble de résultats et est renvoyé lorsque des résultats supplémentaires sont disponibles. Cela vous permet de parcourir une page de résultats à la fois.

BigQuery héberge un certain nombre d'ensembles de données publics disponibles pour le grand public à interroger. Dans l'exemple suivant, vous interrogez l'ensemble de données public USA Name Data pour déterminer les noms les plus courants aux États-Unis entre 1910 et 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"
            }
          ]
        }
      }
    ]
  }
}

Étape suivante