首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QueryString解析在BigQuery中的应用

QueryString解析在BigQuery中的应用
EN

Stack Overflow用户
提问于 2017-07-19 23:56:59
回答 1查看 2K关注 0票数 3

我在BigQuery中有一个列,其中包含一个URL,例如a=1&c=1。我想在我的查询中参考其中的一些。使用类似于WHERE querystring.c = 1的内容进行过滤。

我的计划是将查询字符串转换为JSON,然后使用JSON_EXTRACT。我想我可以编写一个UDF来将查询字符串转换成JSON,但是无论如何,我都无法将node.js 查询字符串包导入到我的UDF中来简化。

可以将node.js核心库导入到UDF中吗?如果可以,如何导入?或者,是否有更好的方法来实现我正在努力做的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-20 00:15:07

或者,是否有更好的方法来实现我正在努力做的事情?

我认为-是的-使用JS是昂贵的资源,并且有一些限制。使用SQL UDF成本较低,如果您愿意,可以通过使用SQL UDF在下面进行转换,但至少下面给您提供了“替代”方法的概念。

对于BigQuery标准SQL

代码语言:javascript
运行
复制
#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   

上面允许您“提取”如下所示的所有键值对。

代码语言:javascript
运行
复制
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子句中使用它们,如下所示

代码语言:javascript
运行
复制
#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'

这给出了下面的结果

代码语言:javascript
运行
复制
id  querystring  
1   a=1&c=1    

注:这只是一种快速而抽象的方法说明--我希望你能根据你的具体情况加以调整/采纳。

下面是将上面的内容转换为使用SQL的示例

代码语言:javascript
运行
复制
#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之类的内容。有什么建议吗?

代码语言:javascript
运行
复制
#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'

结果是

代码语言:javascript
运行
复制
id  querystring             d    
--  -------------------     -----
1   a=1&c=1&d=a%20b%20c     a b c    
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45202931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档