BigQuery 引擎支持从 Google BigQuery 中的表读取数据并向其中写入数据,包括公共数据集。
读取操作使用 BigQuery REST API (tabledata.list) ,因此只能读取原生表 (无法读取视图、materialized view 和外部表) 。写入操作使用流式插入 (tabledata.insertAll) ,这要求项目已启用 billing。
写入并非原子操作:大型 INSERT 会分批发送 (每个 request 最多 500 行,并会进一步拆分以确保不超过 BigQuery’s 10 MB request-size limit) ,单个 request 本身也可能仅部分成功 (BigQuery 可以提交 request 中的部分行,同时通过 insertErrors 拒绝其余行) ;此外,在较早批次已被接受后,后续批次也可能被拒绝——这两种情况下,已提交的行都会保留在 BigQuery 中,而查询将报告 error。每一行都带有稳定的 insertId (根据 query id 和该行的序号生成) ,使 BigQuery 能够尽力对重试的行进行去重;由于 insertId 取决于序号,只有以相同顺序提供行时,重新运行相同的 INSERT 才会进行去重 (例如,采用单线程,并设置 max_threads = 1 和 max_insert_threads = 1) 。有关详情,请参阅 bigquery 表函数的限制。
创建表
REQUIRED BigQuery 字段,则该表可读但不可写:BigQuery 流式插入会拒绝缺少此类字段的行,因此此类 INSERT 会被直接拒绝。如果省略的 REQUIRED 字段声明了 defaultValueExpression,BigQuery 会填入默认值,表仍可写入。NULLABLE RECORD 会映射为 Nullable(Tuple(...)),以确保 NULL 记录可无损往返;创建此类表 (无论结构是推断还是显式声明) 均需启用 enable_nullable_tuple_type 设置,这与任何 Nullable(Tuple) 列相同。显式声明列时,RECORD 字段也可声明为普通的 Tuple(...) 以避免使用该设置,但代价是整个记录的 NULL 会被强制转换为默认元组;与推断类型相比,唯一允许的差异是移除包裹 RECORD 的 Tuple 的 Nullable,且只能在该记录本身移除——不能将可空性移至其他 (内部或外部) 记录。
引擎参数
project— 拥有该数据集的 Google Cloud 项目。dataset— 数据集名称。table— 表名称。access_token— OAuth 2.0 访问令牌 (可选的位置参数) 。
key = value 覆盖。有关完整的键列表及身份验证方法的说明,请参阅 bigquery 表函数。必须且只能提供一种身份验证方法;对于永久表,建议使用 service_account_key 或 refresh_token,而非 access_token,因为访问令牌会在一小时内过期。