BigQuery 中特定的正则表达式查询字符串解析

Regex QueryString Parsing for a specific in BigQuery

所以上周我能够开始将我的 Appengine 日志流式传输到 BigQuery 中,现在我正试图从日志条目中提取一些数据到 table。

protoPayload.resource中的数据是请求的包含querystring参数的页面。

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 例如:

123456

78ec9b4a56

一种方法是将 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))

假设每条记录只有 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