本文详解如何在 google bigquery 的标准 sql 参数化查询中正确传递字符串数组(如 `['cz', 'sk']`),避免因参数配置错误导致仅返回首个元素的问题,并提供可直接运行的完整解决方案。
在 BigQuery 中使用 UNNEST(@param) 处理数组参数时,常见错误并非逻辑缺陷,而是 参数配置层级与结构不匹配。您原始代码中 query_config 的嵌套结构存在关键问题:'queryParameters' 被错误地置于 'query' 字典内,而 pd.io.gbq.read_gbq() 实际期望的是顶层 configuration 字典直接包含 'query' 键——且该键值应为符合 BigQuery REST API 规范 的纯字典,而非嵌套的 {'query': {...}}。
更关键的是,arrayValues 的构造方式虽语法合法,但 pd.io.gbq 对参数序列化的兼容性较弱,易引发静默截断。推荐采用更健壮、官方推荐的方式:直接使用字典形式的 parameterValue,并确保 configuration 结构扁平正确。
以下是修正后的完整可运行代码:
from numpy import array
import pandas as pd
PROJECT_ID = 'prj_id' # 注意:变量名应为 PROJECT_ID(原 PROJEC_ID 拼写错误)
input_array = ['CZ', 'SK'] # 直接使用 Python list,无需 numpy array;dtype=object 非必需
query = """
SELECT country, ROUND(SUM(tvr_yr_month), 0) AS PublicSales
FROM `your_dataset.your_table` -- ⚠️ 请务必替换为真实表名(原查询中为 ``,会报错)
WHERE country IN UNNEST(@countries)
GROUP BY country
"""
# ✅ 正确的 configuration 结构:顶层为 'query',无多余嵌套
query_config = {
"query": {
"parameterMode": "NAMED",
"queryParameters": [
{
"name": "countries",
"parameterType": {
"type": "ARRAY",
"arrayType": {"type": "STRING"}
},
"parameterValue": {
"arrayValues": [
{"value": country} for country in input_array]
}
}
]
}
}
# 执行查询
result = pd.io.gbq.read_gbq(
query,
project_id=PROJECT_ID,
dialect='standard',
configuration=query_config
)
print(result.to_string(index=False))关键修复点说明: