Workflows のメモリ上限を超える BigQuery データセットへのクエリ結果を取得しようとしている場合は、ページトークンを使用して結果をページ分割できます。ページトークンは結果セット内の位置を表し、追加の結果が利用可能な場合に返されます。これにより、結果のページを一度にループできます。
BigQuery は、クエリ対象として一般公開できるいくつかの一般公開データセットをホストしています。次の例では、一般公開データセットの USA Name データをクエリし、1910 年から 2013 年までの米国で最も一般的な名前を調べます。
YAML
# Use a page token to loop through a page of results at a time when
# querying a BigQuery dataset larger than the Workflows memory limit
# This workflow queries a public dataset to determine the most common
# names in the US between 1910 and 2013
main:
params: [input]
steps:
- init:
assign:
- pageToken: null
- startQuery:
call: googleapis.bigquery.v2.jobs.insert
args:
projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
body:
configuration:
query:
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.insert",
"args": {
"projectId": "${sys.get_env(\"GOOGLE_CLOUD_PROJECT_ID\")}",
"body": {
"configuration": {
"query": {
"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"
}
]
}
}
]
}
}