首页 > 解决方案 > 如何在使用 ZetaSQL 的谷歌大查询 sql 中区分 sql 和脚本

问题描述

我正在使用具有以下依赖项的 ZetaSQL ( https://github.com/google/zetasql ) java 实现:

编译组:'com.google.zetasql',名称:'zetasql-client',版本:'2020.08.1' 编译组:'com.google.zetasql',名称:'zetasql-types',版本:'2020.08。 1' 编译组:'com.google.zetasql',名称:'zetasql-jni-channel-linux',版本:'2020.08.1' 编译组:'com.google.zetasql',名称:'zetasql-jni-频道',版本:'2020.08.1'

我正在尝试解析 bigquery sql 以获取引用的表和列,但看起来 ZetaSQL 不支持 bigquery sql 脚本和插入语句。

所以我想知道区分sql和脚本的最佳方法是什么?

如果有办法用 ZetaSQL 解析插入语句?

谢谢,

标签: google-bigquery

解决方案


我一直在使用以下方法进行解析。假设您可以访问字典表(Teradata 中的 INFORMATION_SCHEMA 或 dbc.tables 或 Netezza 中的 v_tables/views 形式)

总体思路是这样的

  1. 首先将查询中的所有字符替换为除 [0-9a-zA-Z._] 之外的所有字符(请注意,我也使用了点和下划线) REGEXP_REPLACE(STRING_AGG(QueryText) , r'[^a-zA-Z0-9._]', ' ') replace_query
  2. 然后根据空格分割查询文本,得到查询中使用的所有单词的数组。 SPLIT(replace_query,' ') words
  3. 然后展平数组并直接与来自 INFORMATION_SCHEMA 的 dataset.tablename 连接 UNNEST(words)

如果您解析 BQ 查询,则 BQ 允许以下格式 projectname.dataset.tablenamedataset.tablename.

所以下一步步骤 4)构建一个案例语句以仅检查那些具有 1 或 2 个点的记录, CASE WHEN ARRAY_LENGTH(REGEXP_EXTRACT_ALL(words, r'[.]'))= 1然后加入dataset.tablename

CASE WHEN ARRAY_LENGTH(REGEXP_EXTRACT_ALL(words, r'[.]'))= 2然后加入project.dataset.tablename

无论加入什么,都是您的一组引用的数据集和表

希望这些步骤有所帮助。


推荐阅读