Paginierung einer BigQuery-Ergebnismenge

Wenn Sie versuchen, die Ergebnisse einer Abfrage für ein BigQuery-Dataset abzurufen, das das Speicherlimit für Workflows überschreitet, können Sie das Seitentoken zum Paginieren der Ergebnisse verwenden. Das Seitentoken stellt die Position in der Ergebnismenge dar und wird zurückgegeben, wenn zusätzliche Ergebnisse verfügbar sind. So können Sie sich die Ergebnisse nacheinander ansehen.

BigQuery hostet eine Reihe von öffentlichen Datasets, die für die allgemeine Öffentlichkeit verfügbar sind. Im folgenden Beispiel fragen Sie das öffentliche Dataset der USA-Namensdaten ab, um die häufigsten Namen in den USA zwischen 1910 und 2013 zu ermitteln.

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

Nächste Schritte