本文件所描述的內容屬於神策分析的高級使用功能,涉及較多技術細節,適用於對相關功能有經驗的用戶參考。如果對文件內容有疑惑,請諮詢您的數據諮詢顧問取得一對一的協助。

1. 概述

神策分析從 1.6 開始為用戶開放自定義“數據預處理模組”,即為 SDK 等方式接入的數據(不包括批量匯入工具方式)提供一個簡單的 ETL 流程,使數據接入更加靈活。該功能僅支援私有部署版。

可以使用“數據預處理模組”處理的數據來源包括:

  • SDK(各語言 SDK 直接傳送的數據,包括可視化埋點的數據。使用 LoggingConsumer 將數據寫到檔案再使用批量匯入工具除外);
  • LogAgent;
  • Logstash;
  • FormatImporter;

數據預處理模組的工作流程如下:

                       數據預處理模組
伺服器端接收到 SDK 數據 -------------------> 匯入神策分析的數據
CODE

數據預處理模組可以:

  • 修改數據內容: 增加、刪除、修改欄位值,修改事件名等;
  • 捨棄數據: 處理結果可直接回傳 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",
        ...
    }
}
JS

現在需將 $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",
        ...
    }
}
JS

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",
        ...
    }
}
JS

現在需要根據 product_id (商品 ID) 在伺服器端查詢到商品的中文名,且中文名英文名映射關係儲存在 redis 中。

這時可以實作“數據預處理模組”,在處理過程中查詢 redis,將查詢結果填入數據:

{
    "distinct_id": "2b0a6f51a3cd6775",
    "time": 1434556935000,
    "type": "track",
    "event": "ViewProduct",
    "project": "sample_project",
    "properties": {
        ...
        "product_id":"ABCDE-12345",
        "product_name":"唐詩三百首",
        ...
    }
}
JS

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": {
        ...
    }
}
JS

可以回傳多條數據:

[
    {
        "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
        }
    }
]
JS
  • 對於1.14 之後的版本,可以透過如上的辦法回傳多條數據。也可以透過多次呼叫傳送的函數來回傳多條數據。