大查询标准与旧语法
Posted
技术标签:
【中文标题】大查询标准与旧语法【英文标题】:Big query standard vs legacy syntax 【发布时间】:2018-09-01 10:16:23 【问题描述】:以下函数在 sql legacy 上完美运行,但在 sql 标准上失败并出现错误:
“参数类型的函数 REGEXP_EXTRACT 没有匹配的签名:ARRAY、STRING。支持的签名:REGEXP_EXTRACT(STRING, STRING); REGEXP_EXTRACT(BYTES, BYTES)”
regexp_extract(split(something,','), r'^(.*?)\:')
我尝试将 ' 替换为 ".. 没有成功。 有什么想法吗?
【问题讨论】:
split
给出了一个不受支持的数组。你想达到什么目的?
我有一个 json 列,如下所示 "X":2,"Y:1 我想要实现的是不同行中的每个键和值:第 1 行 [ x | 2],第 2 行 [Y | 1]
【参考方案1】:
除了使用split
和regexp_extract
,您还可以在JS 中放入一个UDF,以便您轻松解析:
CREATE TEMPORARY FUNCTION parse(json STRING) RETURNS ARRAY<STRING>
LANGUAGE js AS """
p = JSON.parse(json);
arr = [];
for (var key in p)
if (p.hasOwnProperty(key))
arr.push(key + "|" + p[key]);
return arr;""";
WITH foo AS (SELECT '''"X":"2","Y":"1"''' AS something)
SELECT parsed FROM foo, UNNEST(parse(something)) AS parsed
--
Row parsed
1 X|2
2 Y|1
但是,它更多的是代码/SQL,并且对于您需要的东西可能有点矫枉过正。我只是想给你另一个选择,因为我不是使用正则表达式的忠实粉丝!
【讨论】:
【参考方案2】:您需要使用ARRAY
函数作为从SPLIT
返回的元素的for-each 循环。例如,
SELECT
ARRAY(
SELECT regexp_extract(x, r'^(.*?)\:')
FROM UNNEST(split(something,',')) AS x
) AS result
FROM table
【讨论】:
这里是关于该主题的文档:cloud.google.com/bigquery/docs/reference/standard-sql/…以上是关于大查询标准与旧语法的主要内容,如果未能解决你的问题,请参考以下文章