BigQuery JS函数报错:未闭合字符串字面量问题求助
问题原因与解决办法
错误Syntax error: Unclosed string literal的核心原因:
- 定义输出Schema时,用普通双引号包裹了跨多行的字符串,BigQuery标准SQL不允许普通双引号字符串直接换行,导致字符串被截断,出现未闭合情况。
- 字符串内部的
-- error here注释会被当成字符串的一部分,既破坏了Schema的格式,也加剧了换行引发的解析问题。
解决步骤
方法1:将Schema字符串合并为一行
把Schema内容写成单行,去掉换行和内部注释,确保字符串完整闭合:
SELECT type, key FROM ( SELECT * FROM js( (SELECT json, type FROM arboreal-vision-339901.take_home.virtual_kitchen_ubereats_hours ), -- Input columns. json, type, -- Output schema. "[{name: 'key', type:'string'}, {name: 'type', type:'string'}]", -- The function. "function(r, emit) { x=JSON.parse(r.json) Object.keys(x).forEach(function(entry) { emit({key:entry, type:r.type}); }); }" ) ) LIMIT 10
方法2:使用三重引号包裹多行字符串
BigQuery支持用"""(三重双引号)定义多行字符串,可保留换行格式,同时避免未闭合错误:
SELECT type, key FROM ( SELECT * FROM js( (SELECT json, type FROM arboreal-vision-339901.take_home.virtual_kitchen_ubereats_hours ), -- Input columns. json, type, -- Output schema. """[{name: 'key', type:'string'}, {name: 'type', type:'string'}]""", -- The function. """function(r, emit) { x=JSON.parse(r.json) Object.keys(x).forEach(function(entry) { emit({key:entry, type:r.type}); }); }""" ) ) LIMIT 10
额外优化(可选)
按照JSON规范,对象的键必须用双引号包裹,可将Schema里的name和type改为双引号,避免潜在解析问题:
"[{\"name\": \"key\", \"type\":\"string\"}, {\"name\": \"type\", \"type\":\"string\"}]"
或用三重引号时直接编写:
"""[{"name": "key", "type":"string"}, {"name": "type", "type":"string"}]"""
内容的提问来源于stack exchange,提问作者Pavan
相关产品推荐
相关产品推荐

