数据库_duckdb_读取csv创建表等案例

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	 
posted @ 2024-07-22 15:58  辰令  阅读(58)  评论(0编辑  收藏  举报