Google BigQuery No Matching Signature Error报错及JSON字符串提取需求
解决方案
1. 截取Column_A的区域后缀
想从project783/north这类字符串里提取north这种后缀,直接用SPLIT拆分后取数组第二个元素就行(BigQuery数组索引从0开始):
SELECT SPLIT(Column_A, '/')[OFFSET(1)] AS region FROM your_table
你之前碰到的No matching signature for function SPLIT报错,大概率是误把ARRAY类型的参数传给了SPLIT——这个函数只接受STRING类型输入,确保传的是原始的Column_A字符串就没问题。
2. 提取Column_B中分数最高的运动项目
Column_B是存键值对的JSON字符串(比如{"跑步":85, "游泳":92, "篮球":78}),得先解析JSON,拆成键值对行,再筛选最大值对应的项目:
WITH parsed_data AS ( SELECT Column_A, JSON_PARSE(Column_B) AS json_data FROM your_table ), key_value_pairs AS ( SELECT Column_A, key AS sport, CAST(json_data[key] AS INT64) AS score FROM parsed_data, UNNEST(OBJECT_KEYS(json_data)) AS key ) SELECT SPLIT(Column_A, '/')[OFFSET(1)] AS region, sport AS top_sport FROM key_value_pairs QUALIFY ROW_NUMBER() OVER (PARTITION BY Column_A ORDER BY score DESC) = 1
核心逻辑说明
JSON_PARSE把STRING类型的JSON转成JSON对象,比JSON_EXTRACT更适合遍历整个键值对(后者只适合提取单个字段)OBJECT_KEYS(json_data)拿到JSON里所有的运动项目键,配合UNNEST把每个键值对拆成单独的行QUALIFY加ROW_NUMBER(),按每个Column_A分组,直接取分数最高的那行运动项目
整合后的完整查询
把两个需求合并成一个查询:
WITH parsed_json AS ( SELECT Column_A, JSON_PARSE(Column_B) AS sport_scores FROM your_table ), sport_details AS ( SELECT Column_A, sport_name, CAST(sport_scores[sport_name] AS INT64) AS score FROM parsed_json, UNNEST(OBJECT_KEYS(sport_scores)) AS sport_name ) SELECT SPLIT(Column_A, '/')[OFFSET(1)] AS region, sport_name AS highest_score_sport FROM sport_details QUALIFY ROW_NUMBER() OVER (PARTITION BY Column_A ORDER BY score DESC) = 1
常见坑排查
- 要是还报SPLIT的错:检查Column_A是不是真的STRING类型,如果是ARRAY类型,得先转成STRING(比如用
ARRAY_TO_STRING(Column_A, '/'),但按你描述应该是单个字符串) - 要是JSON解析报错:确认Column_B的JSON格式合法,比如引号、逗号都没写错
内容的提问来源于stack exchange,提问作者euler614
相关产品推荐
相关产品推荐

