쿼리 결과를 Workflows 메모리 한도보다 큰 BigQuery 데이터 세트로 검색하려고 시도할 경우 페이지 토큰을 사용하여 결과를 페이지로 나눌 수 있습니다. 페이지 토큰은 결과 집합의 위치를 나타내며, 추가 결과를 사용할 수 있을 때 반환됩니다. 이렇게 하면 한 페이지의 결과를 한 번에 반복할 수 있습니다.
BigQuery는 일반 대중이 쿼리할 수 있는 여러 공개 데이터세트를 호스팅합니다. 다음 예시에서는 미국 이름 데이터 공개 데이터세트를 쿼리해 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"
}
]
}
}
]
}
}