MySQL亿级数据导入及预处理

目录

1 数据集

1.1 概述

1.2 介绍

2环境准备

2.1 安装 jdk 工具包

2.2 安装 Kettle

2.3 MySQL 驱动

2.4 运行 Kettle

3 将亿级数据导入 MySQL

3.1 建立库表

3.2 CSV 输入

3.3 表输出

4 数据预处理

字段处理

检测空值(去空)

检测重复值(去重)

添加字段

检测异常数据(去异常)

​编辑

查看预处理效果


1 数据集

User Behavior Data from Taobao for Recommendation

阿里云天池数据集: User Behavior Data from Taobao for Recommendation

1.1 概述

UserBehavior是阿里巴巴提供的一个淘宝用户行为数据集,用于隐式反馈推荐问题的研究。

1.2 介绍

文件名称说明包含特征
UserBehavior.csv包含所有的用户行为数据用户ID,商品ID,商品类目ID,行为类型,时间戳

UserBehavior.csv

本数据集包含了 2017年11月25日至2017年12月3日 之间,有行为的约 一百万随机用户 的所有行为(行为包括点击、购买、加购、喜欢)。数据集的组织形式和MovieLens-20M类似,即数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下:

列名称说明
用户ID整数类型,序列化后的用户ID
商品ID整数类型,序列化后的商品ID
商品类目ID整数类型,序列化后的商品所属类目ID
行为类型字符串,枚举类型,包括('pv', 'buy', 'cart', 'fav')
时间戳行为发生的时间戳

注意到,用户行为类型共有四种,它们分别是

行为类型说明
pv商品详情页pv,等价于点击
buy商品购买
cart将商品加入购物车
fav收藏商品

关于数据集大小的一些说明如下

维度数量
用户数量987,994
商品数量4,162,024
用户数量987,994
商品类目数量9,439
所有行为数量100,150,807

2环境准备

2.1 安装 jdk 工具包

因为 kettle 是Java写的,它需要 Java 的运行环境。其实只需要下载 jre 即可。然后配置好环境变量。

2.2 安装 Kettle

下载 kettle,Kettle 的作用类似于ORM框架,比如像EF、SqlSugar,Mybatis。。。

2.3 MySQL 驱动

下载 connector,下载后将其移动到 kettle 的 lib 目录即可。

因为Kettle 是Java写的,要与数据库连接,需要下载 JDBC 驱动。

2.4 运行 Kettle

在 window 中只需要点击 spoon.bat 即可。

3 将亿级数据导入 MySQL

3.1 建立库表

首先创建数据库和数据表:

create database taobao;
use taobao;
create table user_behavior (user_id int(9), item_id int(9), category_id int(9), behavior_type varchar(5), timestamp int(14) );

3.2 CSV 输入

在 Kettle 中建立转换,CSV 作为输入,表作为输出,并建立连接:

导入 CSV 文件,修改字段。

3.3 表输出

连接数据库:

数据量较大,配置使用连接池,后续开启多线程处理:

设置参数,开启批处理:

输出目标:

开启15个线程复制:

启动转换:

导入成功:

数据表总共包含一亿零十五万条记录。

4 数据预处理

其实一般是要新建临时表进行测试,再对原表下手。

create table temp_behavior like user_behavior;
insert into temp_behavior select * from user_behavior limit 100000; -- 截取0-10万数据进行测试

字段处理

开始预处理三部曲:

检测空值(去空)

全部字段无空值。

检测重复值(去重)

-- 查看重复的行
select user_id, item_id, timestamps
from user_behavior
group by user_id, item_id, timestamps
having count(*) > 1;

可以看到有53条分组存在重复。

首先创建 id 自增字段辅助去重:

alter table user_behavior add column id int unsigned not null AUTO_INCREMENT PRIMARY KEY FIRST

去重语句:利用重复行新建临时表,记录重复行中 id 最小的值。删除表 user_behavior 中符合连接条件的记录,保留每组相同 user_iditem_idtimestamps 下的最小 id

DELETE user_behavior from user_behavior,
(
select user_id, item_id, timestamps, min(id) id
from user_behavior
group by user_id, item_id, timestamps
having count(*) > 1
) t2 
where user_behavior.user_id = t2.user_id
and user_behavior.item_id = t2.item_id
and user_behavior.timestamps = t2.timestamps
and user_behavior.id > t2.id

完成去重:

添加字段

首先修改缓存,默认是1Mb。我们直接改为10G,10871635968。

新增 datetimes 字段。并将 timestamps 的 int 型改为日期型,赋值给 datetimes。

-- 新增datetimes字段
alter table user_behavior add datetimes TIMESTAMP(0); -- 新建日期字段,去掉毫秒
UPDATE user_behavior set datetimes = FROM_UNIXTIME(timestamps); -- 将timestamps的int型改为日期型,赋值给datetimes
​
-- 注意:删除datetimes中可能存在的 null 值,因为虽然检测了空值,转换的时候有些timestamps不满足转换条件
delete from user_behavior where datetimes is null;

新增 dates、times、hours 字段。并截取 datetimes 填充。

alter table user_behavior add dates char(10);
alter table user_behavior add times char(8);
alter table user_behavior add hours char(2);
UPDATE user_behavior set dates = substring(datetimes, 1, 10), times = substring(datetimes, 12, 8), hours = substring(datetimes, 12, 2);

查看效果:

SELECT * from user_behavior limit 5;

检测异常数据(去异常)

查看是否存在异常值:(此数据集认为不再时间范围内的都为异常数据)

select max(datetimes),min(datetimes) from user_behavior;
 
-- 去异常,不在统计时间内的记录
DELETE from user_behavior
where datetimes < '2017-11-25 00:00:00'
or datetimes > '2017-12-03 23:59:59';

查看预处理效果

-- 查看预处理效果
desc user_behavior; -- 字段是否完整
select * from user_behavior LIMIT 100; -- 概览
select count(*) from user_behavior; -- 查看最终的记录,原一亿零十五万条

可以看到去重了 53 条记录,去异常 55258 条。原记录1000150807 - 55258 - 53 = 100095496。数据在保证去重去异常的情况下保证了数据的完整性。

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MySQL导入千万级数据可以使用多种方法,以下是两种常用的方法: 1. 使用MySQL自带的导入工具:MySQL提供了多个导入工具,如`mysql`命令行工具和`LOAD DATA INFILE`语句。你可以使用这些工具将数据从文件导入MySQL数据库中。具体步骤如下: - 将数据保存为文本文件,每行代表一条记录。 - 使用`mysql`命令行工具登录到MySQL数据库。 - 创建目标表,确保表结构与数据文件中的数据一致。 - 使用`LOAD DATA INFILE`语句将数据文件导入到目标表中。 例如,假设你有一个名为`data.txt`的数据文件,其中包含千万条记录,你可以使用以下命令将数据导入MySQL数据库中: ```shell mysql -u username -p password -h hostname -P port dbname LOAD DATA INFILE '/path/to/data.txt' INTO TABLE tablename; ``` 2. 使用第三方工具:除了MySQL自带的导入工具,还有一些第三方工具可以帮助你快速导入千万级数据。例如,`mysqldump`工具可以将数据导出为SQL文件,然后使用`mysql`命令行工具将SQL文件导入到目标数据库中。另外,一些ETL工具(如Talend、Pentaho)也提供了数据导入功能,可以更加灵活地处理大数据量的导入。 请注意,导入千万级数据可能需要较长的时间和较大的系统资源。为了提高导入速度,你可以考虑以下几点: - 使用合适的硬件设备和网络环境,确保数据库服务器具有足够的计算和存储资源。 - 对数据文件进行预处理,如拆分成多个小文件,以便并行导入。 - 调整MySQL服务器的配置参数,如`innodb_buffer_pool_size`、`innodb_log_file_size`等,以优化导入性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maxlec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值