跳转到主要内容
导出每小时或每个 UTC 日一次,把该窗口的结果以 gzip 压缩的 JSON Lines 写入 Amazon S3 或 Google Cloud Storage 存储桶,或加载到 BigQuery 表的一个分区。你的数据仓库像读取其他数据源一样读取这些结果,无需轮询。 你只需为我们的导出身份授予存储桶或数据集的写入权限,无需共享任何密钥或密码。本页中的密钥、存储桶、 账户 ID 和角色均为示例。

导出的数据

使用账户任意密钥提交的任务,以及 Playground 和监测器创建的任务都会包含在内。一个窗口恰好包含时间落在 [windowStart, windowEnd) 内的行。 送达时间。 窗口关闭 10 分钟后到期,因此在边界结算的费用也会包含在内。到期的窗口由每 15 分钟运行一次的 作业取走,因此通常在窗口关闭后 10 到 25 分钟开始发送。

设置导出

1

查看导出身份

accountKey 是你的文件夹和表的名称。我们写入的每个路径和表都带有它,因此多个 querying.ai 账户 可以共用一个存储桶或数据集,各自只写入自己的文件。请授权响应中显示的身份,而不是上面的示例。
2

授予权限

为该身份授予目标位置的访问权限。S3、Cloud Storage 和 BigQuery 的做法见授予权限。
3

创建导出

POST /v1/exports 会检查授权并保存导出。见创建导出。
4

查看首次发送

GET /v1/exports/{id}/runs 列出每个窗口及其状态。见发送记录。

授予权限

Amazon S3

在你的 AWS 账户中创建一个可由我们的 Google 身份代入的 IAM 角色,并将身份响应中的 trustPolicy 用作该 角色的信任策略。它只接受我们的导出身份,并且只接受你账户的会话名称:
附加一个权限策略,允许该角色写入你的前缀:
如果存储桶使用客户管理的 KMS 密钥加密,还需在该密钥上允许 kms:GenerateDataKey。

Google Cloud Storage

在存储桶上为导出服务账户授予 Storage Object User(roles/storage.objectUser)。它用于创建文件, 并在重新发送窗口时替换文件。
如需把授权限定在你的文件夹,请添加 IAM 条件 resource.name.startsWith("projects/_/buckets/acme-geo/objects/querying/acct_3f9a1c2b7d4e/")。

BigQuery

在数据集上为导出服务账户授予 BigQuery Data Editor(roles/bigquery.dataEditor)。加载作业在我们自己的 项目中运行,因此加载不产生费用;你只需支付存储和你运行的查询费用。

创建导出

请使用没有引擎范围限制的 API 密钥:导出包含账户的全部结果,因此仅限部分引擎的密钥会收到 403 KEY_SCOPE。
保存前,导出会先验证授权。S3 和 Cloud Storage 会写入 <prefix><accountKey>/_querying/connection-check.json;BigQuery 会读取数据集并记录其位置。检查失败时 不保存任何内容。每个账户最多 10 个导出。 响应为 201,包含该导出:
对于 S3 和 Cloud Storage,destination 会回显存储桶设置,并加上 path,即文件写入的文件夹,例如 s3://acme-geo/querying/acct_3f9a1c2b7d4e/ 或 gs://acme-geo/querying/acct_3f9a1c2b7d4e/。 nextWindowStart 是下一个待规划窗口的开始时间。

错误

文件与表

S3 和 Cloud Storage 中的文件

  • 目录遵循 Hive 分区(dt=,每小时导出另有 hour=),因此 Athena、BigQuery 外部表和 Spark 会把它们读成列。
  • v1 是架构版本(导出上的 schemaVersion)。破坏列的变更会以 v2 并列发布。
  • 一个窗口按时间顺序拆分为每份最多 100,000 行的 part 文件。
  • _manifest.json 最后写入。清单出现后再加载该窗口,并从清单中读取 part 列表:
清单中的 rows 等于各 part 文件的行数,也等于发送记录中该 run 的 rows。文件名只取决于窗口,因此重新发送 的窗口会替换相同的对象。

BigQuery 表

BigQuery 导出加载到 querying_tasks_v1_<accountKey> 和 querying_monitor_results_v1_<accountKey>,表在首次 加载时创建,并按 completedAt 或 ranAt 分区(按天;每小时导出按小时)。每个窗口替换自己的分区,因此 重新发送的窗口不会重复。payload、response、sources 和 scoringContext 是 JSON 列:

行架构 (v1)

tasks

monitor_results

发送记录

每个数据集的每个窗口就是一个 run。按时间倒序列出:
可用 status、data(tasks 或 monitor_results)和 limit(1–200,默认 50)筛选;把 nextCursor 作为 cursor 传回即可获取下一页。
  • 自动重试。 失败的尝试会在 15 分钟后重试,之后间隔逐次翻倍,最长 12 小时,共八次。error 中是存储服务 给出的原因,因此缺少权限会首先在这里显示。
  • 重新发送窗口。 POST /v1/exports/{id}/runs/{runId}/retry 立即发送一个窗口:修好授权后发送失败的窗口, 或重写已送达的窗口。它会重置 attempts,并以 pending 返回该 run。正在发送的 run 会返回 409 EXPORT_RUN_RUNNING。
  • 导出健康状况。 GET /v1/exports 和 GET /v1/exports/{id} 会附带 deliveredThrough(最近送达窗口的 结束时间)、failedRuns 和 retryingRuns(至少失败过一次、仍在等待的 run)。

暂停、恢复和删除

  • 用 {"enabled": false} 调用 PATCH /v1/exports/{id} 可暂停导出。{"enabled": true} 恢复导出,并补发 遗漏的窗口,最多回溯 30 天。
  • DELETE /v1/exports/{id} 停止导出。已送达的文件和分区保留在你的存储中。
  • 目标位置、周期和数据集无法更改。请创建新的导出并删除旧的导出。

端点

访问不属于你的导出会返回 404 NOT_FOUND。