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
所以上周我能够开始将我的 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