信息茧房研究-sql数据清洗实战语句记录

本文记录了在信息茧房研究中使用SQL进行数据清洗的过程,包括创建表't'、't1'、't2',确定有效用户uid,数据清洗,用户uid替换,性别编码,以及原创和转发数据的聚合。在聚合过程中遇到Row row 8 was cut by group_concat()的错误,通过调整MySQL的group_concat()最大长度限制得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文主要记录信息茧房研究-sql数据清洗实战语句操作的相关笔记


数据集内容

数据集为表all_info,有500多万行数据,大致内容示例见下表:

uidGenderfull_contentroot_uid
75a673e5c61网上车市了解到,哈弗某款新车型预计5月中旬上市None
673e5c675a1随着三月份的到来,各地的高校也在陆续开学None
f37fae1c9ce1【人大代表#建议鼓励生育要进一步为家长减负#[思考]】None
e137ff1c9cae顶不住了@f37fae1c9ce1:【人大代表#建议鼓励生育要进一步为家长减负#[思考]】f37fae1c9ce1

需求1. 找出所有根微博用户id去重保存到表“t”

create table t (select distinct root_uid from all_info)

需求2. 发博id有属于表“t”的用户id去重保存到“t1”

create table t1 (select distinct uid from all_info 
where uid in (select * from t))

需求3. 转博的根微博用户uid属于“t1”的用户id去重保存到“t2”

create table t2 (select distinct uid from all_info 
where root_uid in (select * from t1))

需求4. 有效用户uid

有效用户uid定义为能够在数据集中形成关系链,即除了只有原创行为或转发的根微博用户uid不在用户id里这两种情况外的所有数据。对“t1”表和“t2”表求并集即可

create table useid (select distinct uid from(select uid from t1 union
select uid from t2)t3)

需求5. 根据有效用户uid进行数据清洗

数据清洗可以直接采用下列语句进行提取,删除不属于有效用户uid的无效数据。

delete from all_info where uid not in (select * from useid)

因速度过慢,所以采用了先新建一个和原表格结构相同的新表“all_info1”,然后再在原“all_info”表中查找符合条件的数据插入到新表中。

create table all_info1 select * from all_info where 1=0

insert into all_info1 select * from all_info where uid in (select * from useid)

插入完成后删除原表格,将新表重命名即可。

需求6. 用户uid的替换-基于多表连接

因为用户uid都是采用一串较长的字符,为了加快检索速度,便于直观观察,将对数据集的所有用户uid进行替换,具体操作是先对“useid”表内的数据进行排序,并新建一列“rankn”记录这个编号,然后使用表连接再将“all_info”与“useid”两表连接起来,并将用户uid相应的编号写入到“all_info”新增的ranknum列(对应uid)和ranknum1(对应root_uid)列。

with t as(select id,ROW_NUMBER()over(order by uid)ro 
from useid)
update useid t1 left join t on t1.uid=t.uid set rankn= t.ro

update all_info t left join useid u on t.uid=u.uid set ranknum=u.rankn
update all_info t left join useid u on t.root_uid=u.uid set ranknum1=u.rankn

需求7. 性别编码-基于源数据处理

因为源数据集有男女标识,为了进一步减少数据集大小,使用数字0代表男,1代表女。

update all_info
set `性别`=replace(`性别`,'男',0)
update all_info 
set `性别`=replace(`性别`,'女',1)

需求8. 原创/转发数据聚合

需要将所有用户转发的文本合并到一起,原创的文本合并到一起,然后将结果导出到新表

CREATE table case_text(
select rank1,`原创/转发`,group_concat(`全文内容`)group_text 
from all_info group by rank1,`原创/转发`)

报错Row row 8 was cut by group_concat()

单独查询聚合结果时不会报错,但导入到新表的时候会显示这个错误,此时,可以更改group_concat()的最大限制长度来解决这个问题。从命令行进入mysql,运行下列语句即可。

-- 查询当前长度
SELECT @@global.group_concat_max_len;

-- 修改全局长度(临时修改)
SET GLOBAL group_concat_max_len=102400000;

SET group_concat_max_len=102400000;

修改完成后即可正常运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sky-JT

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

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

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

打赏作者

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

抵扣说明:

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

余额充值