如何解决如何使用ZetaSQL区分Google大查询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-channel”,版本:“ 2020.08.1”
我正在尝试解析bigquery sql以获取引用的表和列,但是ZetaSQL似乎不支持bigquery sql脚本和insert语句。
所以我想知道区分sql和脚本的最佳方法是什么?
如果有一种使用ZetaSQL解析插入语句的方法?
谢谢
解决方法
我一直在使用以下方法进行解析。 假设您有权访问字典表(在Teradata中以INFORMATION_SCHEMA或dbc.tables的形式或在Netezza中以v_tables / views的形式)
总体思路是这样
- 首先用除[0-9a-zA-Z._]以外的空格替换查询中的所有字符(请注意,我也已使用点和下划线)
test('componentDidMount should be called with setDateOnMount',() => { const setDateOnMount = jest.fn() const location = { state: undefined } const componentDidMount = jest.spyOn(MealSummary.prototype,'componentDidMount') const wrapper = shallow(<MealSummary meals={meals} location={location} setDateOnMount={setDateOnMount} />) expect(componentDidMount).toHaveBeenCalledTimes(1) expect(setDateOnMount).toHaveBeenCalledTimes(1) //errors here that it is not called })
- 然后根据空间拆分查询文本,并获取查询中使用的所有单词的数组。
. . componentDidMount() { this.setDateOnMount() } . . ...
- 然后将数组展平并直接与INFORMATION_SCHEMA中的dataset.tablename联接
REGEXP_REPLACE(STRING_AGG(QueryText),r'[^a-zA-Z0-9._]',' ') replace_query
如果您解析BQ查询,则BQ允许以下格式
SPLIT(replace_query,' ') words
和UNNEST(words)
。
所以下一步
步骤4)构建一个case语句,以仅检查那些具有1个或2个点的记录
projectname.dataset.tablename
然后加入dataset.tablename
CASE WHEN ARRAY_LENGTH(REGEXP_EXTRACT_ALL(words,r'[.]'))= 1
然后加入dataset.tablename
无论连接了什么,都是您引用的数据集和表的集合
希望这些步骤会有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。