duckdb
duckdb 读取csv格式文件
duckdb 连接数据库-创建表
duckdb 将数据转换为dataframe
dataframe apply merge groupby
代码示例
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# ---------------------------
import duckdb
import os
if __name__=="__main__":
csv_dir = r"/test/grade_class/example_csv"
area_file_nm = r"class_grade.csv"
result_file_nm = r"class_school_result.csv"
area_csv_file = os.path.join(csv_dir,area_file_nm)
school_csv_file = os.path.join(csv_dir,result_file_nm)
area_table_nm = "area_info"
school_table_nm = "school_info"
# 如果一张表我们要经常查询还是需要将其导入到数据库
out_file_db = os.path.join(csv_dir,'area_school_file.db')
if not os.path.exists(out_file_db):
conn = duckdb.connect(out_file_db)
c = conn.cursor()
area_table_cmd = ("CREATE TABLE {0} AS SELECT * FROM read_csv_auto('{1}') ").format(area_table_nm,area_csv_file)
school_table_cmd = ("CREATE TABLE {0} AS SELECT * FROM read_csv_auto('{1}') ").format(school_table_nm,school_csv_file)
c.execute(area_table_cmd)
c.execute(school_table_cmd)
c.execute("SELECT * FROM {0} limit 5".format(area_table_nm))
print(c.fetchone())
c.execute("SELECT * FROM {0} limit 3".format(school_table_nm))
print(c.fetchone())
conn.close()
else:
# 原生方式连接到DuckDB
con = duckdb.connect(database = out_file_db, read_only = False)
area_dat = con.sql("SELECT * FROM {}".format(area_table_nm))
area_dat.limit(3).show()
school_dat = con.sql("SELECT * FROM {}".format(school_table_nm))
school_dat.limit(3).show()
## trans to dataframe
area_df = area_dat.df()
school_df = school_dat.df()
## 对 Series 使用 apply
area_df['bag_nm'] = area_df["grade_path"].apply(lambda x: x.split("/")[-1])
# 使用 merge 方法进行内连接
result = school_df.merge(area_df, on='bag_nm', how='left')
print(area_df.head(),result.head() )
out_file_path = os.path.join(csv_dir,"result.csv")
## 保存数据
result.to_csv(out_file_path, index=False)
print(result.head(3))
## 分组统计
data_stat = result.groupby(by=["class","grade"])['student_cnt'].sum().reset_index()
print(data_stat)
con.close()
数据库历史
01.数据库兴起:
数据库三巨头是 Oracle、IBM Db2、Microsoft SQL Server
Oracle,IBM和微软最终成为了商业数据库领域的三驾马车
02.21世纪 以 MySQL 和 PostgreSQL 为代表的开源数据库逐渐成熟
03.云计算时代: 云计算的出现,已经在重构数据库市场
Snowflake MongoDB Redis
the client-server model
客户端-服务器架构时
OLAP方面客户端-服务器,
MySQL PostgreSQL
Oracle Microsoft SQL Serve
OLTP方面客户端-服务器系统,
ClickHouse
Don’t Hold My Data Hostage – A Case For Client Protocol Redesign
说明
是 VLDB 2017 的一篇论文,主要着眼于数据库客户端协议的设计
Result set serialization (RSS) 的性能可能对数据库查询接口性能有较大的影响。
(绝大部分耗时都在 RSS 上,连接数据库和查询实际执行耗时甚至可以忽略不计)
流行的 ODBC 和 JDBC 都主要提供按行访问的 API,然而列式结果集理论上可以有更好的压缩率
提出了一种适用于导出大型结果集的基于列的序列化方法 实现了基于 chunk 的新的结果集格式的协议
按列进行压缩在某些数据集上有不错的表现,但是在全体数据集上可能表现不佳,因此论文的实现方法决定不使用按列压缩
Richard Wisley 参考Marcin Zukowski的博士论文开发出 Tableau Data Engine
The client-server model流程:
服务器将数据序列化为结果集格式。
转换后的消息通过 Socket 发送给客户端。
客户端对结果集进行反序列化,实际使用数据
01.Network Impact
02.不同数据库系统客户端协议使用的结果集格式
设计序列化格式时主要需要权衡序列化/反序列化计算成本和数据传输成
进程内(in-process) 数据库
OLAP 在线事务处理
SQLite 进程内系统,面向 OLTP(在线事务处理)
Firebird
OLTP
DuckDB
vectorized execution engine
Mark Raasveldt 和 Hannes Mühleisen 的作品
嵌入式数据库-Embedded Database) 嵌入式系统 物联网(IoT)设备 移动应用
Berkeley DB Firebird UnQLite
SQLite 是 D.RichardHipp 用一个小型的C库开发
据应用的具体需求进行选择。
对于需要高读写性能的应用,可以选择 LevelDB 或 RocksDB ;
对于需要高可靠性的应用,可以选择 Berkeley DB ; Berkeley DB可以保存任意类型的键/值对(Key/Value Pair)
对于需要简单易用的应用,可以选择 SQLite
Berkeley DB
Empress(商业数据库)
Java 生态圈中的嵌入式数据库 Derby
LevelDB 是由 Google 创建的一个键值对的开源数据库
参考
https://www.infoq.com/articles/analytical-data-management-duckdb/
https://blog.csdn.net/xuejianxinokok/article/details/136205492
标签:school,表等,nm,area,数据库,duckdb,file,csv
From: https://www.cnblogs.com/ytwang/p/18316194