Big Query查询追加表报错,请求排查查询语句问题
问题分析与修复方案
从你给出的错误提示和查询语句来看,主要有几个关键问题导致了语法错误,下面逐一拆解并给出修复方法:
1. Legacy SQL 参数引用符号错误
你在查询里用了$PARTITIONDATE作为变量标记,但BigQuery Legacy SQL 的参数应该用@符号而非$,$是标准SQL(Standard SQL)的参数标记。这会让解析器误判>=的语法角色,从而抛出"Was expecting: )"的错误。
2. _PARTITIONTIME 类型匹配问题
_PARTITIONTIME是TIMESTAMP类型,如果你的@PARTITIONDATE是日期字符串(比如'2018-05-18'),需要显式转换为TIMESTAMP类型,否则会出现类型不匹配的问题。
3. 冗余嵌套子查询与GROUP BY问题
你的查询嵌套了多层不必要的子查询,还多次对所有列执行GROUP BY操作——这不仅降低查询效率,还可能因为SPLIT返回的数组类型在Legacy SQL中GROUP BY的兼容性问题引发意外错误。
4. 命令行目标表写法错误
你在bq query命令里把目标表写成了'sample_dataset.test_table_formated'$20180518,单引号会将表名转为字符串后再拼接$20180518,正确的分区表写法应该是sample_dataset.test_table_formated$20180518(去掉单引号)。
修复后的查询语句(Legacy SQL)
SELECT CATS_W_TIMESTAMPS_KEY, SPLIT(VALUES, ",") AS VALUES, TAG_URI, PIXEL_URL, REFERRER, CAMPAIGN_ID, WIN_TIME, OBFS_BKUUID, PIXEL_ID, IP_ADDRESS, DATA_DATE, PROCESS_DATE, TRACK_ID FROM ( SELECT FIRST(SPLIT(CATS_W_TIMESTAMPS, ":")) AS CATS_W_TIMESTAMPS_KEY, NTH(2, SPLIT(CATS_W_TIMESTAMPS, ":")) AS VALUES, TAG_URI, PIXEL_URL, REFERRER, CAMPAIGN_ID, WIN_TIME, OBFS_BKUUID, PIXEL_ID, IP_ADDRESS, DATA_DATE, PROCESS_DATE, TRACK_ID FROM ( SELECT SPLIT(CATS_W_TIMESTAMPS, ';') AS CATS_W_TIMESTAMPS, TAG_URI, PIXEL_URL, REFERRER, CAMPAIGN_ID, WIN_TIME, OBFS_BKUUID, PIXEL_ID, IP_ADDRESS, DATA_DATE, PROCESS_DATE, TRACK_ID FROM [sample_dataset.test_table_1] WHERE _PARTITIONTIME >= TIMESTAMP(@PARTITIONDATE) ) ) -- 若无需去重则可去掉冗余GROUP BY,子查询已无重复行
修复后的bq命令行
bq query \ --destination_table sample_dataset.test_table_formated$20180518 \ --append_table \ --use_legacy_sql=true \ --allow_large_results \ --parameter=PARTITIONDATE:'2018-05-18' \ < sample.txt
额外建议:改用Standard SQL
BigQuery现在推荐使用Standard SQL,它语法更标准、功能更丰富,分区表查询也更直观。如果可以切换,改写后的查询会更简洁:
SELECT SPLIT(cwt, ':')[SAFE_OFFSET(0)] AS CATS_W_TIMESTAMPS_KEY, SPLIT(SPLIT(cwt, ':')[SAFE_OFFSET(1)], ',') AS VALUES, TAG_URI, PIXEL_URL, REFERRER, CAMPAIGN_ID, WIN_TIME, OBFS_BKUUID, PIXEL_ID, IP_ADDRESS, DATA_DATE, PROCESS_DATE, TRACK_ID FROM `sample_dataset.test_table_1`, UNNEST(SPLIT(CATS_W_TIMESTAMPS, ';')) AS cwt WHERE _PARTITIONTIME >= PARSE_TIMESTAMP('%Y-%m-%d', @PARTITIONDATE)
对应的bq命令(默认使用Standard SQL,无需加--use_legacy_sql=true):
bq query \ --destination_table sample_dataset.test_table_formated$20180518 \ --append_table \ --allow_large_results \ --parameter=PARTITIONDATE:string:'2018-05-18' \ < sample.txt
内容的提问来源于stack exchange,提问作者Yathin
相关产品推荐
相关产品推荐

