2015-02-10 50 views
3

因此,上周我能够开始将Appengine日志流式传输到BigQuery中,并且现在试图将一些数据从日志条目中拉出到表中。正则表达式QueryString针对BigQuery中的特定问题解析

protoPayload.resource中的数据是包含查询字符串参数请求的页面。

protoPayload.resource的内容看起来像下面的例子:

/service.html?device_ID=123456 
/service.html?v=2&device_ID=78ec9b4a56 

我越来越近,但是当有DEVICE_ID前另一个项目,我没有得到它。正如你可以看到我对Regex不太好,但它是我认为我可以解析查询中的数据的唯一方法。为了从第一个例子中得到设备ID,我可以使用下面的例子。很棒。我的下一个挑战是第二个参数存在时的数据。设备ID的长度可以在10到26个字符之间变化。

SELECT 
RIGHT(Regexp_extract(protoPayload.resource,r'[\?&]([^&]+)'), 
length(Regexp_extract(protoPayload.resource,r'[\?&]([^&]+)'))-10) as Device_ID 
FROM logs 

我想什么是刚刚从查询字符串值DEVICE_ID如:

78ec9b4a56

+0

如果有你的protoPayload.resource例如换行还是有实际2个查询字符串每个记录? – 2015-02-11 19:01:44

回答

4

假设你有每个记录仅有1查询字符串,那么你可以这样做:

SELECT REGEXP_EXTRACT(protoPayload.resource, r'device_ID=(.*)$') as device_id FROM mytable 

的部分括号内将被捕获并在结果中返回。

如果DEVICE_ID不能保证是字符串中的最后一个参数,然后使用这样的事情:

SELECT REGEXP_EXTRACT(protoPayload.resource, r'device_ID=([^\&]*)') as device_id FROM mytable 
+0

谢谢。 device_ID应该是最后一个参数,但其中一个服务客户端可能会混淆它。 – csjohnstone 2015-02-13 15:27:12

1

一种方法是protoPayload.resource分割成多个服务项目,并然后应用正则表达式 - 这样它将支持任意数量的device_id,即

select regexp_extract(service_entry, r'device_ID=(.*$)') from 
(select split(protoPayload.resource, ' ') service_entry from 
(select 
    '/service.html?device_ID=123456 /service.html?v=2&device_ID=78ec9b4a56' 
    as protoPayload.resource))