2015-02-10 52 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))