google-bigquery - 如何在使用 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 解析插入语句?
谢谢,
解决方案
我一直在使用以下方法进行解析。假设您可以访问字典表(Teradata 中的 INFORMATION_SCHEMA 或 dbc.tables 或 Netezza 中的 v_tables/views 形式)
总体思路是这样的
- 首先将查询中的所有字符替换为除 [0-9a-zA-Z._] 之外的所有字符(请注意,我也使用了点和下划线)
REGEXP_REPLACE(STRING_AGG(QueryText) , r'[^a-zA-Z0-9._]', ' ') replace_query
- 然后根据空格分割查询文本,得到查询中使用的所有单词的数组。
SPLIT(replace_query,' ') words
- 然后展平数组并直接与来自 INFORMATION_SCHEMA 的 dataset.tablename 连接
UNNEST(words)
如果您解析 BQ 查询,则 BQ 允许以下格式
projectname.dataset.tablename
和dataset.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
无论加入什么,都是您的一组引用的数据集和表
希望这些步骤有所帮助。
推荐阅读
- angular - 将所有页面中的默认文本替换为自定义文本
- python - PythonAnywhere:SystemError:参数说明符多于关键字列表条目(剩余格式:'s#|O!O!O!')
- java - 在 JavaFX TreeView 中手动提交编辑
- java - 为什么 Roy 和头像hackerearth 的测试用例失败了?
- google-calendar-api - Google 日历 - 外部活动来宾的自动电子邮件通知
- html - 我应该使用 role="note" 作为输入的帮助文本吗?
- javascript - 问题循环遍历数组
- arrays - for 循环弄乱数组返回
- go - 如何回复频道的发送者并管理状态
- python - Python 从 Gcloud 获取账单信息