在私有化部署场景下,经常会有历史数据导入的需求。本文将介绍增长分析产品是如何支持数据导入的,您可以参考本文档完成数据导入。其中,文档中使用的导入工具可以咨询运维人员单独获取。
推荐使用JAVA SDK或者HTTP API的方式进行数据导入
该导入方式需要咨询运维人员获取导入工具
公共属性: 也称用户属性,用于描述事件通用的一些属性,通常用来刻画设备、用户、环境等,比如网络类型、设备ID、操作系统等,一般SDK里默认采集的属性信息作为公共属性;
事件参数: 用于描述一个事件所携带的参数,比如浏览页面事件,参数有url和referer,分别表示被访问页面和来源页面;
自定义属性: 在公共属性满足不了分析需求时,可以通过自定义属性的方式进行补充,比如地域信息;
事件导入和用户属性导入: DataFinder采用的维度建模方式,事件表作为事实表,用户属性表作为维度表,因此在导入时支持分别导入事件和用户属性。
需要先进行用户属性导入,再进行事件导入,否则在分析时会丢失用户属性。
数据分为用户以及事件两部分。导入时,某个事件必须能与某个用户相关联。需要提供如下格式的数据,原始数据格式默认为parquet格式。
字段 | 数据类型 | 是否可以为空 | 如果为空填充为 | 含义 | 备注 |
---|---|---|---|---|---|
global_id | String | 否 | 用户非空唯一id,用于关联用户和事件,需要在导入时和事件中的global_id关联,确保同一个用户的global_id在事件和用户数据中一致 | global_id 不可重复 | |
uuid | String | 是 | 空字符串 | 用户唯一id | uuid 非空值不可重复 |
idfa | String | 是 | 空字符串 | Identifier For Advertising(仅 IOS) | |
idfv | String | 是 | 空字符串 | Identifier For Vendor(仅 IOS) | |
openudid | String | 是 | 空字符串 | 安卓唯一设备标识(仅 Android) | |
register_time | Long | 否 | 用户注册时间的毫秒时间戳 | ||
timezone | Long | 否 | 时区 | 例如 8, -8, 0 | |
platform | String | 否 | 用户设备注册平台 | android 或 ios | |
int_profiles | Map<String, Long> | 是 | 空Map | 所有值类型为整型的用户属性集合 | |
float_profiles | Map<String, Double> | 是 | 空Map | 所有值类型为浮点型的用户属性集合 | |
string_profiles | Map<String, String> | 是 | 空Map | 所有值类型为字符串的用户属性集合 | |
string_array_profiles | Map<String, List> | 是 | 空Map | 所有值类型为字符串数组的用户属性集合 |
在 增长分析产品的 用户体系中,使用设备ID + uuid 确定一个用户。对于一个 uuid 存在的用户,历史数据迁移完成,以及接入 SDK 后能识别为同一个用户。但对于 uuid 不存在的匿名用户,若历史数据中无设备ID,则可能在接入 SDK 后被识别为不同用户。
字段 | 数据类型 | 是否可以为空 | 如果为空填充为 | 含义 | |
---|---|---|---|---|---|
global_id | String | 否 | 用户非空唯一id,用于关联用户和事件 | ||
event | String | 否 | 事件名 | ||
time | Long | 否 | 事件发生的毫秒时间戳 | ||
server_time | Long | 是 | time字段 | 事件到达服务端的毫秒时间戳 | |
timezone | Long | 否 | 时区 | 例如 8, -8, 0 | |
int_params | Map<String, Long> | 是 | 空Map | 所有值类型为整型的事件属性集合 | |
float_params | Map<String, Double> | 是 | 空Map | 所有值类型为浮点型的事件属性集合 | |
string_params | Map<String, String> | 是 | 空Map | 所有值类型为字符串的事件属性集合 | |
string_array_params | Map<String, List> | 是 | 空Map | 所有值类型为字符串数组的事件属性集合 |
事件属性是不同事件特有的属性,按类型存放在事件数据中的 int_params、float_params、string_params 字段中。
事件名称 | 事件含义 | 平台 | 属性名称 | 属性中文名 | 属性存放位置 | 属性含义 |
---|---|---|---|---|---|---|
app_launch | 应用启动事件 | App | ||||
小程序 | scene | 场景值 | int_params | 用户从何种场景启动小程序 | ||
小程序 | query_from_title | 页面标题 | string_params | 用户启动的页面标题 | ||
小程序 | path | 页面地址 | string_params | 用户启动的页面地址 | ||
app_terminate | 应用关闭事件 | App | duration | 本次打开应用的会话时长 | int_params | 本次打开应用的会话时长 |
小程序 | session_duration | 本次打开应用的会话时长 | int_params | 本次打开应用的会话时长 | ||
小程序 | session_depth | 会话深度 | string_params | 会话深度 | ||
小程序 | exit_page | 会话退出页 | string_params | 用户跳出页面 | ||
小程序 | scene | 场景值 | int_params | 用户从何种场景启动小程序 | ||
predefine_pageview | 用户浏览页面 | Web | url | 访问链接 | string_params | 用户访问的 url |
Web | url_path | 访问路径 | string_params | 用户访问的路径 | ||
Web | referrer | string_params | 来源 url | |||
Web | title | 页面标题 | string_params | |||
小程序 | path | 页面地址 | string_params | 访问路径 | ||
小程序 | scene | 场景值 | int_params | 用户从何种场景启动小程序 | ||
小程序 | title | 页面标题 | string_params | |||
predefine_pageview_hide | 用户退出页面 | 小程序 | duration | 停留时长 | int_params | 用户浏览页面的停留时长 |
小程序 | path | 页面地址 | string_params | 页面地址 | ||
小程序 | scene | 场景值 | int_params | 用户从何种场景启动小程序 | ||
on_share | 分享 | 小程序 | path | 页面地址 | string_params | 用户分享的页面地址 |
title | 标题 | string_params | 用户分享的页面标题 |
公共属性是每个事件都应当具有的属性,同样按类型存放在事件数据中的int_params、float_params、string_params。
属性名称 | 属性中文名 | 属性含义 | 平台 | 数据类型 | 备注 |
---|---|---|---|---|---|
app_channel | 渠道 | 软件安装渠道 | App 小程序 | int_params | |
app_region | 软件国家 | 软件国家 | App | string_params | |
sdk_version | 应用版本 | sdk应用版本号 | App | string_params | 如 1.0.1 |
app_version | 软件版本 | 软件版本 | App 小程序 Web | string_params | 如 1.0.1 |
app_version_minor | 四位版本号 | 四位版本号 | App | string_params | 如 1.0.0.0 |
client_ip | IP地址 | 用户IP地址 | App 小程序 Web | string_params | |
device_brand | 手机品牌 | 用户使用手机品牌 | APP 小程序 | string_params | |
device_model | 手机型号 | 用户使用手机型号 | APP 小程序 | string_params | |
language | 系统语言 | 系统语言 | App 小程序 Web | string_params | |
network_type | 网络类型 | 用户所处网络环境类型 | App 小程序 | string_params | 如 wifi, 4G 等 |
network_carrier | 运营商 | 用户运营商 | App 小程序 | string_params | 如 中国移动、中国联通、中国电信 等 |
os_name | 操作系统 | 操作系统 | App 小程序 Web | string_params | 如 android、 ios、windows |
os_version | 系统版本 | 操作系统版本 | App 小程序 Web | string_params | |
package | 安装包名 | 安装包名 | App | string_params | |
region | 系统国家 | 系统国家 | App | string_params | |
resolution | 分辨率 | 用户手机分辨率 | App 小程序 Web | string_params | |
browser | 浏览器 | 浏览器名 | Web | string_params | |
browser_version | 浏览器版本 | 浏览器版本 | Web | string_params | |
mp_platform | 小程序平台 | 小程序类型 | 小程序 | string_params | "0" - 微信 |
mp_platform_app_version | 平台版本号 | 小程序平台版本号 | 小程序 | string_params | datafinder 版本 >= 3.1.x 支持 |
event_platform | 事件来源平台 | 小程序 Web | string_params | "mp" - 小程序 | |
mp_platform_basic_version | 小程序基础库版本 | 小程序基础库版本 | 小程序 | string_params |
用户属性是描述用户的属性,按类型存放在 int_profiles、string_profiles、float_profiles 中。
属性名称 | 属性中文名 | 属性含义 | 平台 | 存放位置 | 备注 |
---|---|---|---|---|---|
gender | 性别 | 性别 | 小程序 | string_profiles | 为 male 或 female |
下面命令中数据的path都是hdfs的路径,
运行以下命令进行用户导入。该命令会注册用户并导入用户属性,映射文件的生成位置以及 schema 同用户注册任务。任务首先会寻找该 app 对应的映射文件。对不存在于映射文件中的用户进行注册,然后对所有用户进行属性导入。
./import_user.sh --input_path {user_file_path} --app_id {app_id} [--profile_time {profile_time_ms}]
用户导入可以多次运行,每次运行只会注册并导入未注册的用户。如果需要全量重新导入用户数据,可以添加参数 --import_all。导入默认发送转换后的 json string 到 user_profile 中,也可以使用 --topic {topic} 指定发送的 topic。
在某些时候,离线导入数据以及实时数据同时存在。考虑以下场景:
用户 a 在历史数据中存在一个用户属性 nick_name = bob。随后用户 a 通过实时数据修改该属性为 nick_name = John。由于导入用户属性采用 set 方式,且认为导入的属性为最新版本,因此如果此时导入用户历史数据,则 nick_name = bob 会覆盖 nick_name = John 造成用户最新的属性丢失。
为了避免这种情况需要手动添加 --profile_time 。指定 profile_time 后,如果某个属性存在 profile 服务会对比 profile_time 与该属性最近一次修改的时间,如果 profile_time 小于该时间,则不会更新属性。即历史导入的属性不会覆盖最新的属性。一般来说,profile_time 应当设置为用户数据从历史环境中导出完成时的毫秒时间戳。
运行以下命令进行事件导入。该任务会寻找该 app 对应的映射文件。并根据事件的 global_id join 映射文件获取 ssid 以及 device_id 并填充到事件中,注意这里 join 的是 映射文件中的用户,而不是 clickhouse 中的用户,未能 join 成功的事件不会上传,并被列入导入失败的事件数量中。
./import_event.sh --input_path {evet_file_path} --app_id {app_id}
其中 {evet_file_path} 为事件属性在 HDFS 上的路径。{app_id} 含义同上。
事件导入默认发送转换后的 json string 到 behavior_event 中,也可以使用 --topic {topic}指定发送的 topic。
重复运行事件导入任务会产生重复数据,如果导入过程出现错误,则需要清除历史数据后再重新导入
运行该命令会对数据字段进行校验,确保用户提供的必要字段正确。
./check.sh --user_path {user_file_path} --event_path {event_file_path}
用户数据以及事件数据可以单独校验。如果单独对事件进行校验,则在该 app_id 对应的用户注册任务已经完成的情况下,可以指定 app_id 替代用户数据路径 {user_file_path} 如:
./check.sh --event_path {event_file_path} --app_id {app_id}
指定 app_id 后会使用该 app 已经生成的映射文件对事件和用户的关联关系进行检测。如果用户数据路径以及 app_id 都未提供,则无法检测事件和用户的关联情况。
校验结果示例如下:
{ "info" : { "用户总数" : 10001 }, "warning" : { "存在用户注册时间小于等于 0 或为 null" : 10001 }, "error" : { "存在用户 global_id 重复" : 9999, "存在用户无 global_id" : 10000, "存在用户 platform 不正确" : 10001 } } { "info" : { "事件总数" : 12001 }, "warning" : { "存在事件无属性" : 12001, "存在事件无法关联到到用户" : 12000 }, "error" : { "存在事件无事件名" : 12001 } }
检查结果为不同等级的{信息: 数量}
键值对。其中包括三个等级,分别为:
存在警告信息对导入结果不会产生较大影响,但仍然需要用户确认其影响范围。而存在错误信息则表示该数据无法进行导入,必须要求用户修正这些错误才能进行下一步导入工作。
其中警告信息以及对应含义为:
其中错误信息及其对应含义为:
某些场景用户需要自定义事件公共属性,可以通过设置文件指定。文件格式为 json:
{ "common_param_names": [ "custom_ip", "custom_nick_name" ] }
然后在运行用户导入时添加 --config-file
选项,例如:
./import_event.sh --app_id 10000035 --input_path /user/datarangers/mock_data/events.json --file_format json --config-file config.json
文档中描述的预置事件公共属性字段会自动转换,无需手动通过配置文件添加。
某些测试场景下需要清除已经生成的映射文件,可以使用以下命令进行:./clear_id.sh {app_id}