Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery BigQueryURL解码_Google Bigquery - Fatal编程技术网

Google bigquery BigQueryURL解码

Google bigquery BigQueryURL解码,google-bigquery,Google Bigquery,在BigQuery语言中有没有一种简单的URL解码方法?我正在处理一个表,该表有一列,其中包含一些值中的URL编码字符串。例如: http://xyz.com/example.php?url=http%3A%2F%2Fwww.example.com%2Fhello%3Fv%3D12345&foo=bar&abc=xyz 我提取url参数,如下所示: SELECT REGEXP_EXTRACT(column_name, "url=([^&]+)") as url fro

在BigQuery语言中有没有一种简单的URL解码方法?我正在处理一个表,该表有一列,其中包含一些值中的URL编码字符串。例如:

http://xyz.com/example.php?url=http%3A%2F%2Fwww.example.com%2Fhello%3Fv%3D12345&foo=bar&abc=xyz
我提取url参数,如下所示:

SELECT REGEXP_EXTRACT(column_name, "url=([^&]+)") as url 
from [mydataset.mytable]
这给了我:

http%3A%2F%2Fwww.example.com%2Fhello%3Fv%3D12345
我想做的是:

SELECT URL_DECODE(REGEXP_EXTRACT(column_name, "url=([^&]+)")) as url 
from [mydataset.mytable]
因此,返回:

http://www.example.com/hello?v=12345
我希望避免使用多个REGEXP\u REPLACE语句替换%20、%3A等。。。如果可能的话


想法?

这是一个很好的功能请求,但目前没有内置的BigQuery函数提供URL解码。

另一个解决方法是使用用户定义的函数

标准SQL 创建临时函数URL\u解码字符串 返回字符串 语言JSAS 试试{ 返回decodeURIenc;; }捕获e{returnnull} 返回null; ; 选择ven_会话, URL_DECODEREGEXP_EXTRACTpara,r'&kw=\w |[^&]*'作为q 来自raas_system.weblog_20170327 其中类似“%$kw=%”的参数 限制10
我同意这里的每个人的观点,URLDECODE应该是一个本机函数。但是,在此之前,可以编写本机URLDECODE:

从选择中选择id、安全\u将\u字节\u转换为\u字符串数组\u转换为\u字符串,b 身份证件 数组_AGGCASE 当REGEXP_CONTAINSy时,r^%,然后从_HEXSUBSTRy,2 否则以字节形式显示 以ps的形式结束订单 从SELECT x AS id,REGEXP_EXTRACT_ALLx,r%[0-9a-fA-F]{2}[^%]+作为UNNESTARRAY的元素['domodossola%e2%80%93locarno railway','gabu%c5%82t%c3%b3w']作为x作为x 将UNNESTx.element交叉连接为y,偏移量为i按id分组; 在本例中,我尝试并测试了使用来自Wikipedia的两个百分比编码的页面名称作为输入的实现。它也应该与您的输入一起工作

显然,这是非常笨拙的!出于这个原因,我建议构建一个物化连接表,或者将其包装到视图中,而不是在查询中使用这个表达式。然而,它似乎确实完成了任务,并且没有达到UDF的限制


EDIT:将这个繁琐的实现包装成一个漂亮、整洁的小sqludf。这是一个更好的处理方法

下面是在@sigpwned answer的基础上构建的,但是稍微进行了重构,并用SQL UDF进行了包装,它没有JS UDF安全使用的限制

标准SQL 创建临时函数urldecateurl字符串作为 选择安全\u将\u字节\u转换为\u字符串 数组\u到字符串数组\u AGG 如果以y开头,从y开始,“%”,从x开始,2,按i的字节顺序排列 B 从UNNESTREGEXP_EXTRACT_ALLurl,r%[0-9a-fA-F]{2}|[^%]+作为y,偏移量作为i ; 选择 列名称, URLDECODEREGEXP_EXTRACTcolumn_名称,url=[^&]+作为url 来自“project.dataset.table”` 可通过以下问题中的示例进行测试

标准SQL 创建临时函数urldecateurl字符串作为 选择安全\u将\u字节\u转换为\u字符串 数组\u到字符串数组\u AGG 如果以y开头,从y开始,“%”,从x开始,2,按i的字节顺序排列 B 从UNNESTREGEXP_EXTRACT_ALLurl,r%[0-9a-fA-F]{2}|[^%]+作为y,偏移量作为i ; 将'project.dataset.table'作为 选择'http://example.com/example.php?url=http%3A%2F%2Fwww.example.com%2Fhello%3Fv%3D12345&foo=bar&abc=xyz“列名称” 选择 URLDECODEREGEXP_-EXTRACTcolumn_名称,url=[^&]+作为url, 列名 来自“project.dataset.table” 结果

行url列名称 1.http://www.example.com/hello?v=12345 http://example.com/example.php?url=http%3A%2F%2Fwww.example.com%2Fhello%3Fv%3D12345&foo=bar&abc=xyz 使用进一步优化的SQL UDF进行更新

创建临时函数urldecateurl字符串作为 选择字符串\u AGG 如果regexp_CONTAINSy,r'^%[0-9a-fA-F]{2}, 安全\u将\u字节\u转换为\u字符串,从\u HEXREPLACEy,“%”,y, 我点的菜 从UNNESTREGEXP_EXTRACT_ALLurl,r%[0-9a-fA-F]{2}?:%[0-9a-fA-F]{2}*.[^%]+y 用我的偏移量 ;
是否有此功能请求的链接?谢谢!作为SQLUDF的良好包装!已编辑。如果要将查询存储为视图,则会出现此问题