如何在Jupyter中获取ClickHouse查询的全部6000万条记录?
解决ClickHouse查询结果在Jupyter中仅加载部分数据的问题
1. 调整ClickHouse客户端的结果行数限制
不同Python客户端库默认会限制返回的结果行数,需手动关闭限制:
- 若使用
clickhouse-driver:from clickhouse_driver import Client # max_result_rows=0 表示不限制返回行数 client = Client('localhost', max_result_rows=0) full_result = client.execute('SELECT * FROM your_target_table') - 若使用
clickhouse-connect:import clickhouse_connect # max_rows=0 关闭行数限制 client = clickhouse_connect.get_client(host='localhost', max_rows=0) full_result = client.query('SELECT * FROM your_target_table').result_set
2. 分批加载超大规模数据集
6000万条数据一次性加载可能导致内存溢出,建议分批读取:
方法1:LIMIT+OFFSET分页(适合小批量测试,大数据下效率一般)
batch_size = 1000000 # 每次加载100万条 total_count = client.execute('SELECT COUNT(*) FROM your_target_table')[0][0] all_data = [] for offset in range(0, total_count, batch_size): query = f'SELECT * FROM your_target_table LIMIT {batch_size} OFFSET {offset}' batch_data = client.execute(query) all_data.extend(batch_data)
方法2:基于有序列的范围分页(效率更高)
假设表中有自增ID或时间戳这类有序字段:
batch_size = 1000000 last_value = 0 # 初始值设为有序字段的最小值 all_data = [] while True: # 假设有序字段为id,根据实际字段修改 query = f'SELECT * FROM your_target_table WHERE id > {last_value} ORDER BY id LIMIT {batch_size}' batch_data = client.execute(query) if not batch_data: break all_data.extend(batch_data) last_value = batch_data[-1][0] # 更新为当前批次最后一条的id值
3. 先聚合再加载(推荐)
直接加载6000万条数据制作柱状图效率极低,建议在ClickHouse中先完成聚合计算,再加载聚合后的结果:
-- 示例:按分类字段聚合统计数量 SELECT category_field, COUNT(*) AS item_count FROM your_target_table GROUP BY category_field
将上述查询结果加载到Jupyter,直接用聚合后的少量数据生成柱状图即可。
4. 确认Jupyter的显示限制(非数据加载问题)
Jupyter默认会限制DataFrame的显示行数,但数据实际已加载到内存。可以通过以下代码验证:
import pandas as pd df = pd.DataFrame(full_result) print(f"总数据条数:{len(df)}") # 输出应为6000万左右 # 如果需要显示全部数据,修改pandas显示参数 pd.set_option('display.max_rows', None) pd.set_option('display.max_columns', None)
内容的提问来源于stack exchange,提问作者Pardis Bagheri
相关产品推荐
相关产品推荐

