數據預處理模組
本文件所描述的內容屬於神策分析的高級使用功能,涉及較多技術細節,適用於對相關功能有經驗的用戶參考。如果對文件內容有疑惑,請諮詢您的數據諮詢顧問取得一對一的協助。
1. 概述
神策分析從 1.6 開始為用戶開放自定義“數據預處理模組”,即為 SDK 等方式接入的數據(不包括批量匯入工具方式)提供一個簡單的 ETL 流程,使數據接入更加靈活。該功能僅支援私有部署版。
可以使用“數據預處理模組”處理的數據來源包括:
- SDK(各語言 SDK 直接傳送的數據,包括可視化埋點的數據。使用 LoggingConsumer 將數據寫到檔案再使用批量匯入工具除外);
- LogAgent;
- Logstash;
- FormatImporter;
數據預處理模組的工作流程如下:
數據預處理模組
伺服器端接收到 SDK 數據 -------------------> 匯入神策分析的數據
數據預處理模組可以:
- 修改數據內容: 增加、刪除、修改欄位值,修改事件名等;
- 捨棄數據: 處理結果可直接回傳 null 將一條數據捨棄;
- 增加數據: 由一條數據衍生出多條數據;
由於數據預處理模組可以對數據進行較大改變,請謹慎使用!
處理函數拋出異常將導致整條數據被捨棄,請謹慎處理,例如空值異常錯誤。
關於實作“數據預處理模組”,1.13 或 1.13 之前的版本可參考 sensorsdata/ext-processor-sample。
1.14 之後的版本可參考 sensorsdata/preprocessor-sample。
本文件將提供一些場景舉例。
2. 修改數據內容
2.1. 解析 URL 參數
當一些欄位不方便在用戶端解析,可透過“數據預處理模組”在伺服器端解析。
例如 SDK 傳來一條數據,傳入“數據預處理模組”時格式如下:
{
"distinct_id": "2b0a6f51a3cd6775",
"time": 1434556935000,
"type": "track",
"event": "ViewProduct",
"project": "sample_project",
"ip": "123.123.123.123",
"properties": {
...
"$referrer":"http://www.kbyte.cn/view?title=abc&act=click",
...
}
}
現在需將 $referrer 中的 title,act 等欄位解析出來並設定為單獨欄位。
這個需求可透過實作一個“數據預處理模組”來實作,將數據處理成如下結果並回傳:
{
"distinct_id": "2b0a6f51a3cd6775",
"time": 1434556935000,
"type": "track",
"event": "ViewProduct",
"project": "sample_project",
"properties": {
...
"$referrer":"http://www.kbyte.cn/view?title=abc&act=click",
"source_title":"abc",
"source_act":"click",
...
}
}
2.2. JOIN 外部欄位
當期望的數據中有一部分需要在後端才能取得時,可透過“數據預處理模組” JOIN 補全數據。
例如 SDK 傳來一條瀏覽商品數據,其中包含欄位 product_id (商品 ID),傳入數據如下:
{
"distinct_id": "2b0a6f51a3cd6775",
"time": 1434556935000,
"type": "track",
"event": "ViewProduct",
"project": "sample_project",
"ip": "123.123.123.123",
"properties": {
...
"product_id":"ABCDE-12345",
...
}
}
現在需要根據 product_id (商品 ID) 在伺服器端查詢到商品的中文名,且中文名英文名映射關係儲存在 redis 中。
這時可以實作“數據預處理模組”,在處理過程中查詢 redis,將查詢結果填入數據:
{
"distinct_id": "2b0a6f51a3cd6775",
"time": 1434556935000,
"type": "track",
"event": "ViewProduct",
"project": "sample_project",
"properties": {
...
"product_id":"ABCDE-12345",
"product_name":"唐詩三百首",
...
}
}
3. 捨棄數據
當一些數據符合期望捨棄的條件,可以直接回傳 null 將其捨棄。
例如捨棄指定 ip 傳來的數據。
- 對於1.14 之後的版本,可以選擇不執行傳送數據的指令來捨棄數據。
4. 增加數據
“數據處理模組”輸入為一條數據,輸出可以是多條數據。
回傳多條數據時,回傳值需要是一個 JSON 陣列,陣列中每一個元素都為一條符合 神策分析 數據格式的數據。
例如,當用戶觸發了 ViewProduct 事件後,我們標記其為 VIP 用戶,輸入數據為:
{
"distinct_id": "2b0a6f51a3cd6775",
"time": 1434556935000,
"type": "track",
"event": "ViewProduct",
"project": "sample_project",
"ip": "123.123.123.123",
"properties": {
...
}
}
可以回傳多條數據:
[
{
"distinct_id":"2b0a6f51a3cd6775",
"time":1434556935000,
"type":"track",
"event":"ViewProduct",
"project": "sample_project",
"properties":{
...
}
},
{
"distinct_id":"2b0a6f51a3cd6775",
"type":"profile_set",
"time":1434556935000,
"project": "sample_project",
"properties":{
"is_vip":true
}
}
]
- 對於1.14 之後的版本,可以透過如上的辦法回傳多條數據。也可以透過多次呼叫傳送的函數來回傳多條數據。