# 数据清理工具使用说明

## 1. 概述

数据清理工具既可用于清理神策分析中导入的行为事件数据，也可用于对导入的行为事件数据去重。

该工具 **不提供** 的功能如下：

1. 删除指定属性的数据。
2. 删除某次批量导入的数据。
3. 删除某个时间段导入的数据。
4. 将某个事件定义删除。但是元数据管理中可以对事件进行隐藏，管理员可以操作。

数据清理为 **不可逆操作**，频繁或大量的清理数据将导致碎片过多可能会 **影响导入进度**，请谨慎操作。

## 2. 使用方法

请先 ssh 到部署了神策服务的任意一台机器，在 sa\_cluster 账户下使用数据清理工具。从 root 切换到 sa\_cluster 账户：

```
su - sa_cluster
```

* 请注意 su 与 sa\_cluster 中间的减号。

### 2.1 事件删除

该方法可以清理一个项目指定时间段内 **所有事件**或者**某些指定事件** 的行为事件数据。

* *该时间段为 **事件行为** 的时间，非导入数据的时间段。*
* 该方法会保留事件、事件属性的定义。
* 单机版：不会立即释放磁盘，后台会缓慢释放，如果删除的是指定事件的数据那么释放的时间可能会很长。
* 集群版：不会立即释放磁盘，每天凌晨会例行清理。**注意** ： 集群版事件删除一般需要消耗大量时间和资源，尽量**不要**指定过大的时间范围。另外支持使用 `-m` 参数加快执行速度。

参数列表：

| 参数名        | 必须 | 说明                                            | 格式         | 样例          | 备注     |
| ---------- | -- | --------------------------------------------- | ---------- | ----------- | ------ |
| begin      | √  | 删除数据的起始日期（包含这一天）                              | yyyy-MM-dd | 2015-12-21  |        |
| end        | √  | 删除数据的结束日期（包含这一天）                              | yyyy-MM-dd | 2015-12-22  |        |
| events     |    | 指定删除数据的 event，集群版可同时指定多个事件，使用逗号分隔             | 事件名称       | ButtonClick |        |
| project    |    | 操作对应的项目，默认为“默认项目”                             | 项目名        | my\_project |        |
| hours      |    | 指定删除数据所属的小时数或范围，多个不连续的时间之间使用逗号分               | \[0-23]    | 0,\[3-5]    | 仅集群版支持 |
| max\_tasks |    | 指定 event 进行删除时，可以通过该参数设置任务的并发度，从而加快执行速度，默认为1。 | 正整数        | 2           | 仅集群版支持 |
| libs       |    | 删除的事件来源，多个来源之间使用逗号分隔。                         | LIBS       | LIBS        |        |

* 清除 default 项目下 2015 年 12 月 22 日这 1 天的行为事件数据：

```
sa_clean clean_event_by_date --begin 2015-12-22 --end 2015-12-22 --project default
```

* 清除 production 项目下 2015 年 12 月 20 日 到 22 日这 3 天的行为事件数据：

```
sa_clean clean_event_by_date --begin 2015-12-20 --end 2015-12-22 --project production
```

* 清除 my\_project 项目下 ButtonClick 这个事件 2015 年 12 月 20 日 到 22 日这 3 天的行为事件数据，其他事件无改动：

```
sa_clean clean_event_by_date --begin 2015-12-20 --end 2015-12-22 --event ButtonClick
--project my_project
```

* 清除 my\_project 项目 ButtonClick 这个事件 2015 年 12 月 22 日 0 点、3 点、4 点、5 点的行为事件数据，其他事件无改动：

```
sa_clean clean_event_by_date --begin 2015-12-22 --end 2015-12-22 --event ButtonClick
--hours 0,[3-5] --project my_project
```

* 清除 my\_project 项目 ButtonClick 这个事件 2015 年 12 月 22 日 0 点、3 点、4 点、5 点的来自于 scala 和 python 的行为事件数据，其他事件无改动：

  ```
  sa_clean clean_event_by_date --begin 2015-12-22 --end 2015-12-22 --event ButtonClick
  --hours 0,[3-5] --project my_project --libs scala,python
  ```

### 2.2 支持GDPR欧盟标准 ，删除底层用户数据 (目前仅支持1.13.5169单机版)

* 方案一： 使用用户 id 直接删除 (目前 event user 数据均被删除)  &#x20;

参数列表：

| 参数名              | 必须 | 说明                             | 格式       | 样例           | 备注                                  |
| ---------------- | -- | ------------------------------ | -------- | ------------ | ----------------------------------- |
| filename         | √  | 包含 id set 的文件,                 | filename | user\_id.txt | 默认为 user\_id                        |
| is\_distinct\_id |    | id set 的文件中包含的是否是 distinct\_id |          |              | 若 id set 中的数据是 distinct\_id, 需指定此参数 |
| project          |    | 操作对应的项目，默认为“默认项目”              | 项目名      | my\_project  |                                     |

1. 创建用户文本，每行一个用户（user\_id 或者 distinct\_id）（USER\_ID\_SET\_FILENAME或者DISTINCT\_ID\_SET\_FILENAME）
2. 使用如下指令删除\
   使用 user\_id 删除的指令

   ```
   sa_clean clean_event_and_profile_by_id_list --project PROJECT_NAME --filename USER_ID_SET_FILENAME
   ```

   使用 distinct\_id 删除的指令

   ```
   sa_clean clean_event_and_profile_by_id_list --project PROJECT_NAME --filename DISTINCT_ID_SET_FILENAME --is_distinct_id
   ```
3. 方案二：使用 profile\_delete 标记删除

参数列表：

| 参数名           | 必须 | 说明                  | 格式  | 样例          | 备注                 |
| ------------- | -- | ------------------- | --- | ----------- | ------------------ |
| only\_profile |    | 是否只删除 profile 表中的数据 |     |             | 指定后，仅删除 profile 数据 |
| project       |    | 操作对应的项目，默认为“默认项目”   | 项目名 | my\_project |                    |

1. 用户调用 profile\_delete 接口标记数据为删除状态
2. 使用如下命令删除数据

   删除 event 和 user 数据

   ```
   sa_clean clean_event_and_profile_by_is_deleted --project PROJECT_NAME
   ```

   仅删除 user 数据&#x20;

   ```
   sa_clean clean_event_and_profile_by_is_deleted --project PROJECT_NAME --only_profile
   ```

### 2.3 事件去重

该方法会去重重复导入的数据

参数列表：

| 参数名     | 必须 | 说明                | 格式         | 样例          | 备注 |
| ------- | -- | ----------------- | ---------- | ----------- | -- |
| begin   | √  | 删除数据的起始日期（包含这一天）  | yyyy-MM-dd | 2015-12-21  |    |
| end     | √  | 删除数据的结束日期（包含这一天）  | yyyy-MM-dd | 2015-12-22  |    |
| project |    | 操作对应的项目，默认为“默认项目” | 项目名        | my\_project |    |

* 去重 my\_project 项目 2016 年 1 月 2 号全天的数据

  ```
  sa_clean distinct_event_by_date --project my_project --begin '2016-01-02' --end '2016-01-02'
  ```

## 3. 其他

由于删除是不可逆操作，所以执行过程中需要用户键入 `yes` 并回车才会进行实际删除操作。如果在执行前已经确认操作是正确的（主要用于自动化脚本），那么可以加 `--yes` 参数，将不会再要求键入 `yes` 才能执行。
