替代使用 dryRun 来区分 BigQuery 中的标准查询和旧版 SQL 查询?
Alternative to using dryRun to differentiate a Standard and Legacy SQL query in BigQuery?
什么
有谁知道使用 BigQuery API 在旧版或标准 SQL 中编写的视图或查询之间的更好方法 identifying/differentiating?
想到的唯一方法是 运行 将 SQL 与 dryRun
属性 设置为 true
(这会产生最小处理开销),如果它失败并显示包含短语 "Try using standard SQL" 的消息,我可以假设它是遗留的 SQL,否则它可以工作并且是标准的。例如
{
...
"code": 400,
"message":
"Invalid table name: `my-project.my_dataset.hello_world`
[Try using standard SQL (https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql)]."
}
原因
我正在维护一个使用 BigQuery API.
迁移数据的集成层(用 Cloud Functions 编写 - Node.js 8)
遗憾的是,用户社区已获准在标准版或旧版中编写视图和查询 SQL。由于处理 Legacy 时存在诸多限制 SQL 我想检测使用它编写的查询和视图,从而允许我相应地调整处理方法。
Does anyone know a better way of identifying/differentiating between a view or query written in Legacy or Standard SQL, using the BigQuery API?
您可以尝试使用 javascript 正则表达式来识别 SQL.
的类型
您可以使用以下代码片段作为基准
isStandardSql(idString) {
let isStandard, fullId, partialId, projectId = '';
// This 'if' checks if the provided idString is of type standard and makes sure there is only one ':' in the expression (as in legacy syntax)
const splitted = idString.split(/[:.]/g);
if (splitted.length > 3) {
const __ret = this.try2findProjectId(idString, projectId);
idString = __ret.idString;
projectId = __ret.projectId;
}
if ((idString.match(/:/g))) {
// Regex that checks if the format of the id match legacy
let matched = idString.match(/([\[]([^[]|[\[][\]])*[\]])/g);
if (matched && matched[0]) {
fullId = projectId + matched[0].substring(1, idString.length - 1);
isStandard = false;
} else {
this.errorMessage("First Regex", idString);
}
// Same as the first only that here instead of ':' we are looking for '.' and we want to make sure there is more than 1 (as in standard syntax)
} else if ((idString.match(/\./g) && idString.match(/\./g).length === 2)) {
// Regex that checks if the format of the id match standard
let matched = idString.match(/(`([^`]|``)*`)/g);// ? idString.match(/(`([^`]|``)*`)/g) : [idString];
if (matched && matched[0]) {
fullId = projectId + matched[0].substring(1, idString.length - 1);
isStandard = true
} else if(!matched && idString){
fullId = projectId + idString;
isStandard = true;
}
else {
this.errorMessage("Second Regex", idString);
}
}
else {//projectID.dataset
// In case of id without projectId of proxy "use" project.dataset
if(splitted.length === 2) {
fullId = '';
if (idString[0] === '[' && idString[idString.length - 1] === ']') {
isStandard = false;
}
else if (idString[0] === '`' && idString[idString.length - 1] === '`') {
isStandard = true;
}
partialId = idString.replace(/`|\[|\]/g, '')
}
else {
this.errorMessage("Third Regex", idString);
}
}
// Return values is flag the determine the type (standard or legacy) and id without staring/ ending chars (``, [])
return {
isStandard,
fullId: fullId,
partialId: partialId
};
}
try2findProjectId(idString, projectId)
{
let numOfInstances = 0
for (let i = idString.length; i > 0; i--) {
const char = idString[i - 1]
if (char === ':' || char === '.') {
numOfInstances++
if (numOfInstances === 2) {
projectId = idString.substring(1, i - 1)
idString = idString.substring(i - 1, idString.length)
idString = idString[idString.length - 1] === '`' ? '`' + idString : idString
idString = idString[idString.length - 1] === ']' ? '[' + idString : idString
}
}
}
return {idString, projectId}
}
什么
有谁知道使用 BigQuery API 在旧版或标准 SQL 中编写的视图或查询之间的更好方法 identifying/differentiating?
想到的唯一方法是 运行 将 SQL 与 dryRun
属性 设置为 true
(这会产生最小处理开销),如果它失败并显示包含短语 "Try using standard SQL" 的消息,我可以假设它是遗留的 SQL,否则它可以工作并且是标准的。例如
{
...
"code": 400,
"message":
"Invalid table name: `my-project.my_dataset.hello_world`
[Try using standard SQL (https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql)]."
}
原因
我正在维护一个使用 BigQuery API.
迁移数据的集成层(用 Cloud Functions 编写 - Node.js 8)遗憾的是,用户社区已获准在标准版或旧版中编写视图和查询 SQL。由于处理 Legacy 时存在诸多限制 SQL 我想检测使用它编写的查询和视图,从而允许我相应地调整处理方法。
Does anyone know a better way of identifying/differentiating between a view or query written in Legacy or Standard SQL, using the BigQuery API?
您可以尝试使用 javascript 正则表达式来识别 SQL.
的类型您可以使用以下代码片段作为基准
isStandardSql(idString) {
let isStandard, fullId, partialId, projectId = '';
// This 'if' checks if the provided idString is of type standard and makes sure there is only one ':' in the expression (as in legacy syntax)
const splitted = idString.split(/[:.]/g);
if (splitted.length > 3) {
const __ret = this.try2findProjectId(idString, projectId);
idString = __ret.idString;
projectId = __ret.projectId;
}
if ((idString.match(/:/g))) {
// Regex that checks if the format of the id match legacy
let matched = idString.match(/([\[]([^[]|[\[][\]])*[\]])/g);
if (matched && matched[0]) {
fullId = projectId + matched[0].substring(1, idString.length - 1);
isStandard = false;
} else {
this.errorMessage("First Regex", idString);
}
// Same as the first only that here instead of ':' we are looking for '.' and we want to make sure there is more than 1 (as in standard syntax)
} else if ((idString.match(/\./g) && idString.match(/\./g).length === 2)) {
// Regex that checks if the format of the id match standard
let matched = idString.match(/(`([^`]|``)*`)/g);// ? idString.match(/(`([^`]|``)*`)/g) : [idString];
if (matched && matched[0]) {
fullId = projectId + matched[0].substring(1, idString.length - 1);
isStandard = true
} else if(!matched && idString){
fullId = projectId + idString;
isStandard = true;
}
else {
this.errorMessage("Second Regex", idString);
}
}
else {//projectID.dataset
// In case of id without projectId of proxy "use" project.dataset
if(splitted.length === 2) {
fullId = '';
if (idString[0] === '[' && idString[idString.length - 1] === ']') {
isStandard = false;
}
else if (idString[0] === '`' && idString[idString.length - 1] === '`') {
isStandard = true;
}
partialId = idString.replace(/`|\[|\]/g, '')
}
else {
this.errorMessage("Third Regex", idString);
}
}
// Return values is flag the determine the type (standard or legacy) and id without staring/ ending chars (``, [])
return {
isStandard,
fullId: fullId,
partialId: partialId
};
}
try2findProjectId(idString, projectId)
{
let numOfInstances = 0
for (let i = idString.length; i > 0; i--) {
const char = idString[i - 1]
if (char === ':' || char === '.') {
numOfInstances++
if (numOfInstances === 2) {
projectId = idString.substring(1, i - 1)
idString = idString.substring(i - 1, idString.length)
idString = idString[idString.length - 1] === '`' ? '`' + idString : idString
idString = idString[idString.length - 1] === ']' ? '[' + idString : idString
}
}
}
return {idString, projectId}
}