目录

5000元笔记本处理8亿行数据量

目录

前面提到过在上上个项目中,客户给了订单数据的数据库,有 500 多张表。

让 chatgpt 写了段批量将数据下载的代码:

import pymysql
import pandas as pd

# 建立 MySQL 数据库连接
conn = pymysql.connect(
    host='your_host', db='your_db_name', user='user',
    passwd='password', charset='utf8')

# 循环遍历每个表,导出为 CSV 文件
for i in range(512):
    try:
        print("开始第%s张表" % i)
        table_name = f"chapter_orders{i}"
        query = "select * from {table_name}"
        df = pd.read_sql(query, conn)
        file_name = f"{table_name}.csv"
        df.to_csv(file_name, index=False)
    except:
        pass
# 关闭数据库连接
conn.close()

但是同事并没有这么做,因为她笔记本就 256G 的硬盘,空间不够。

而她在客户提供的 msyql 数据库中,把每几十张表需要的字段合成一张大表,大概合了 8 张表。

但是后面发现执行的语句有误,需要重新跑所有的数据,而刚好她在合并表的并没有加需要的字段。

让她本地搞吧,但是一张表下载下来 200 多M, 500 多张表要 100 多G,她电脑根本不行。

就算她下载下来,自己笔记本用 mysql 也搞不定这么大的数据量。

让她在客户提供的数据库上重新再来一遍吧,又不知道要费多少工夫。

头疼。

我自己来吧。

先是执行上述 python 代码,将 500 多张表下载到我笔记本上,花费大概 30 多个小时。

然后在笔记本上开启大数据杀器, clickhouse 。

写个 Bash 脚本,批量将 500 多个 CSV 文件导入clickhouse.

for file in *.csv; do
sed -n '2,$p' "$file" | clickhouse client --query 'insert into chapter FORMAT CSV' --date_time_input_format=best_effort
echo "$file"
done

clickhouse导入数据比 mysql 快多了,大概 200 多M的 csv 文件,平均 2 秒一个。

用 DBeaver 连接 clickhouse ,就可以写 SQL 了。

看一下数据量:

select count(1) from chapter;

共计:895,049,813 接近 9 亿行数据。

只需要 2 秒就能跑出上面结果,很难想象用 mysql 跑个 9 亿的数据是怎么样。而且还是我这个 2019 年出厂的联想小新 pro 的笔记本上。

在笔记本上跑个稍微复杂点的 SQL ,也一般不超过 30 秒就出结果。

clickhouse,YYDS。

只要是上千万的数据,我感觉用它都更加方便,省时。

再比如上个项目,同事两个百万级的表也 join 反应不出来,电脑直接崩死。

有时候感觉心累,反应不出来,我也不能怪人。电脑容量不够,我也没法提供电脑。有些客户要个数据都难,更别说让他们提供服务器了。就算提供服务器了,给你搭建个 mysql 环境,大数据量下,照样跑不出来。

其实想想,不会也有不会的好处,没有哪个项目会因为技术问题而停滞。

会有会的做法,不会有不会的做法。

开心就好。