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

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

时间:2024-07-22 16:11:33浏览次数:13  
标签:school 表等 nm area 数据库 duckdb file 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	 

标签:school,表等,nm,area,数据库,duckdb,file,csv
From: https://www.cnblogs.com/ytwang/p/18316194

相关文章

  • Python Pandas:如何解析没有行结尾的 CSV
    如何解析没有行结尾的CSV文件?示例数据sep=;Id;Date;1;1980-02-29;2;1980-03-10;3;;可以使用lineterminator参数指定行终止符来解析没有行尾的CSV文件。在这种情况下,你可以将lineterminator设置为一个空字符串('')。以下是使用......
  • 如何更快地比较同一 csv 文件中的行
    我有一个csv文件,包含720,000行和10列,与问题相关的列是['timestamp_utc','looted_by__name','item_id','quantity']此文件是人们在游戏中掠夺地面的物品的日志,问题是有时地面虫子和类型在两个不同的行中两次掠夺相同物品的人(这两行最多可以相隔5行),在'tim......
  • 将新数据附加到 .csv?
    每个人!我正在尝试从网站上抓取数据并将任何尚未复制到.csv文件的条目添加到.csv文件中,但我似乎无法正确编写它。url='www.website.com'defgetInfo():globaloldMaxValue,oldMaxRow,newInfonewInfo=0withopen("file.csv","a")asf:data......
  • 猫头虎 Python知识点分享:pandas--read_csv()用法详解
    ......
  • IOError:[Errno 2]没有这样的文件或目录:'sample.csv'
    我收到IOError:[Errno2]Nosuchfileordirectory:'sample.csv'CSV文件与脚本位于同一位置。我也从相同的路径运行它。这是我的代码:importcsvkitfile_name='sample.csv'withopen(file_name,'rb')asf:reader=csvkit.reader(f)printreader......
  • Python:如何从 csvreader 列表中删除括号和单引号?
    Pythonn00b在这里。尝试使用csvreader从文件导入数组并打印一个值,但它添加了括号和单引号。这是我的代码:importrandomimportcsvwithopen('crimes.csv','r')ascsvfile:crimes=list(csv.reader(csvfile))hello=["Hello","Greetings","Hi&q......
  • Python Pandas - 读取 CSV 或 Excel
    我允许用户上传CSV或Excel文件。我正在使用pandas读取文件并创建数据框。由于我无法预测用户将上传哪种文件类型,因此我将pd.read_csv()和pd.read_excel()包装在try/except块中。ifform.validate_on_submit():input_filename=secure_filename(form.file.da......
  • Python pandas to_csv 导致 OSError: [Errno 22] 参数无效
    我的代码如下:importpandasaspdimportnumpyasnpdf=pd.read_csv("path/to/my/infile.csv")df=df.sort_values(['distance','time'])df.to_csv("path/to/my/outfile.csv")此代码成功从infile.csv(一个3GBcsv文件)读取数据,对其进行排......
  • 忽略 CSV 文件开头的文本
    我正在尝试从网络下载CSV文件。但是,前20行是列定义,数据从第24行开始(中间的行是空白)。我的代码是:data=pd.read_csv(fileURL,skiprows=[23],on_bad_lines='skip')返回的是作为两列数据框的列定义,20k行数据被忽略如果没有-on_bad_lines-我收到错......
  • 我正在尝试复制 Kaggle 上用于 DAX ESG Media Dataset 的脚本。它下载了 CSV 文件,但没
    文件名是SDGalignmentwithDAXcompanies-Swisstext2023.ipynb我正在使用colaboratory(https://colab.research.google.com/drive)来处理脚本,但我只是收到错误我在colaboratory上下载了有效的文件,他们尝试安装但它不会工作。我已经无计可施了。......