我在BigQuery中有一个列,其中包含一个URL,例如a=1&c=1
。我想在我的查询中参考其中的一些。使用类似于WHERE querystring.c = 1
的内容进行过滤。
我的计划是将查询字符串转换为JSON,然后使用JSON_EXTRACT。我想我可以编写一个UDF来将查询字符串转换成JSON,但是无论如何,我都无法将node.js 查询字符串包导入到我的UDF中来简化。
可以将node.js核心库导入到UDF中吗?如果可以,如何导入?或者,是否有更好的方法来实现我正在努力做的事情?
发布于 2017-07-20 00:15:07
或者,是否有更好的方法来实现我正在努力做的事情?
我认为-是的-使用JS是昂贵的资源,并且有一些限制。使用SQL UDF成本较低,如果您愿意,可以通过使用SQL UDF在下面进行转换,但至少下面给您提供了“替代”方法的概念。
对于BigQuery标准SQL
#standardSQL
WITH yourTable AS (
SELECT 1 AS id, 'a=1&c=1' AS querystring UNION ALL
SELECT 2, 'c=2&b=3'
)
SELECT
id,
querystring,
SPLIT(kv, '=')[SAFE_OFFSET(0)] AS key,
SPLIT(kv, '=')[SAFE_OFFSET(1)] AS value
FROM yourTable, UNNEST(SPLIT(querystring, '&')) AS kv
上面允许您“提取”如下所示的所有键值对。
id querystring key value
2 c=2&b=3 b 3
1 a=1&c=1 c 1
1 a=1&c=1 a 1
2 c=2&b=3 c 2
所以现在您可以在WHERE子句中使用它们,如下所示
#standardSQL
WITH yourTable AS (
SELECT 1 AS id, 'a=1&c=1' AS querystring UNION ALL
SELECT 2, 'c=2&b=3'
)
SELECT
id,
querystring,
FROM yourTable, UNNEST(SPLIT(querystring, '&')) AS kv
WHERE SPLIT(kv, '=')[SAFE_OFFSET(0)] = 'c'
AND SPLIT(kv, '=')[SAFE_OFFSET(1)] = '1'
这给出了下面的结果
id querystring
1 a=1&c=1
注:这只是一种快速而抽象的方法说明--我希望你能根据你的具体情况加以调整/采纳。
下面是将上面的内容转换为使用SQL的示例
#standardSQL
CREATE TEMPORARY FUNCTION parse(qs STRING, key STRING) AS (
(SELECT SPLIT(kv, '=')[SAFE_OFFSET(1)] FROM UNNEST(SPLIT(qs, '&')) AS kv WHERE SPLIT(kv, '=')[SAFE_OFFSET(0)] = key )
);
WITH yourTable AS (
SELECT 1 AS id, 'a=1&c=1' AS querystring UNION ALL
SELECT 2, 'c=2&b=3'
)
SELECT
id,
querystring
FROM yourTable
WHERE parse(querystring, 'c') = '1'
注意:通常querystring没有重复的键--因此没有处理dups的情况--但是如果需要的话很容易:o)
但是它不会解码任何编码的组件,所以我的值仍然包含%20之类的内容。有什么建议吗?
#standardSQL
CREATE TEMPORARY FUNCTION parse(qs STRING, key STRING) AS (
(SELECT SPLIT(kv, '=')[SAFE_OFFSET(1)] FROM UNNEST(SPLIT(qs, '&')) AS kv WHERE SPLIT(kv, '=')[SAFE_OFFSET(0)] = key )
);
CREATE TEMP FUNCTION decode(str STRING)
RETURNS STRING
LANGUAGE js AS """
if (str == null) return null;
try {
return decodeURIComponent(str);
} catch (e) {
return str;
}
""";
WITH yourTable AS (
SELECT 1 AS id, 'a=1&c=1&d=a%20b%20c' AS querystring UNION ALL
SELECT 2, 'c=2&b=3'
)
SELECT
id,
querystring,
decode(parse(querystring, 'd')) as d
FROM yourTable
WHERE parse(querystring, 'c') = '1'
结果是
id querystring d
-- ------------------- -----
1 a=1&c=1&d=a%20b%20c a b c
https://stackoverflow.com/questions/45202931
复制相似问题