【问题标题】:Regex QueryString Parsing for a specific in BigQueryBigQuery 中特定的正则表达式 QueryString 解析
【发布时间】:2015-04-11 00:21:48
【问题描述】:

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

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

protoPayload.resource 的内容类似于以下示例:

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

我快接近了,但是当 device_ID 之前有另一个条目时,我没有得到它。正如您所看到的,我对正则表达式并不擅长,但这是我认为我可以解析查询中的数据的唯一方法。为了仅从第一个示例中获取设备 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 示例中应该有换行符,还是每条记录实际上有 2 个查询字符串?

标签: regex google-app-engine logging google-bigquery


【解决方案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))

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢。 device_ID 应该是最后一个参数,但有可能其中一个服务客户端会混淆它。
    猜你喜欢
    • 2017-12-25
    • 2011-10-09
    • 1970-01-01
    • 2012-10-17
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多