BigQuery查询Google专利数据量异常及数据缺失问题咨询
1. 多字段查询数据量暴增的原因
计费逻辑与列存储特性
BigQuery按扫描的数据量计费,而非返回结果的大小。你第一个仅查询publication_number的请求,利用了列存储的优势——只扫描目标列的数据;再加上patents-public-data.patents.publications表是按publication_number聚簇的,能快速定位匹配行,因此仅需扫描2.3GB。
参数化查询的dry_run预估偏差
你使用的参数化查询WHERE publication_number IN UNNEST(@pub_numbers)在dry_run阶段,BigQuery无法获取@pub_numbers的具体值,会默认按全表扫描所有涉及列来预估数据量,这就是为什么dry_run显示300GB。实际执行时,若@pub_numbers仅包含少量专利号,真实扫描量会远低于这个预估。
嵌套列的扫描成本
你查询的title_localized、abstract_localized、claims_localized都是嵌套数组类型,这些列本身包含大量文本数据。当你需要访问嵌套字段时,BigQuery必须扫描对应列的全部数据(或匹配聚簇块内的全部数据),这比仅扫描单一字符串列的成本高得多。
2. 无法找到US-20150258241-A1的原因
US-20150258241-A1是专利申请公开号(后缀A代表申请公开阶段),而US9370603B2是该申请授权后的专利公开号(后缀B代表授权公开阶段)。patents-public-data.patents.publications表主要收录授权专利的公开数据,申请公开的记录需要到patents-public-data.patents.applications表中查询。
补充:查询示例
仅查询单一字段的示例:
SELECT publication_number FROM patents-public-data.patents.publications WHERE publication_number = "US-9370603-B2" LIMIT 1
触发大量预估扫描的多字段查询:
SELECT publication_number, ARRAY( SELECT text FROM UNNEST(title_localized) WHERE language = "en" ) AS title_en, ARRAY( SELECT text FROM UNNEST(abstract_localized) WHERE language = "en" ) AS abstract_en, filing_date, application_number, assignee, ARRAY( SELECT text FROM UNNEST(claims_localized) ) AS claims_text FROM `patents-public-data.patents.publications` WHERE publication_number IN UNNEST(@pub_numbers)
内容的提问来源于stack exchange,提问作者Adrian

