数据库_duckdb读写Parquet文件

发布时间 2023-03-22 21:14:26作者: 辰令

基本概念

OLtp
  单条记录的增删改查,通常是整条记录
   频繁的插入或更新;
OLap
  某几列的整表统计.分组,排序,聚合等

行存储:一条记录存储在连续的磁盘上
列存储:一条记录存储在磁盘的不同位置,但是整个关系(表)的一列存储在连续的磁盘上.

代码示例

#!/usr/bin/python3
# -*- coding: utf-8 -*- 

import duckdb
 
 # 创建DB(嵌入式DBMS)
conn = duckdb.connect(r'tt\spotiStats.duckdb')
c = conn.cursor()
 
 # 通过从CSV中导入内容创建表格 一个全新的数据库,添加了两个新表,并用所有数据填充了它们
src_data = r"tt\data_info.json"
c.execute( "drop table  IF EXISTS features ")
sql_cmd= "CREATE TABLE features AS SELECT * FROM read_json('{}',auto_detect=true,json_format='auto');".format(src_data)
print(sql_cmd)
c.execute( sql_cmd)
 
#查询数据
data = c.sql("SELECT * FROM features")
print(data)
 

dst_data = r"tt\old_songs.parquet"
dst_sql_cmd = "COPY ( SELECT   * FROM  features ) TO  '{}' (FORMAT PARQUET); ".format(dst_data)
print(dst_sql_cmd)
c.execute(dst_sql_cmd)

Parquet优点

Parquet 是一种支持嵌套结构的列式存储格式,非常适用于 OLAP 场景,按列存储和扫描。
 列存使得更容易对每个列使用高效的压缩和编码(一个页是最小的编码的单位),降低磁盘空间。
 映射下推,这是列式存储最突出的优势,是指在获取数据时只需要扫描需要的列,不用全部扫描。
 谓词下推,是指通过将一些过滤条件尽可能的在最底层执行以减少结果集。谓词就是指这些过滤条件,即返回

Parquet文件构成

  Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的
    Parquet 设计上就是只读的 不支持ACID和update
一个 Parquet 文件是由
 一个 header 以及一个或多个 block 块组成,以一个 footer 结尾。
  header 中只包含一个 4 个字节的数字 PAR1 用来识别整个 Parquet 文件格式。
  block Parquet 的存储模型主要由行组(Row Group 默认 128M)、列块(Column Chuck)、页(Page)组成。
      Row group: 将数据水平划分成多个行组
      column chunk: 行组中.每个列组成一个列块;每个列块连续存储
      page: 页,将列块分割成多个页.有数据页,字典页,索引页.
  footer 中最后两个字段为一个以 4 个字节长度的 footer 的 metadata,以及同 header 中包含的一样的 PAR1
  文件中所有的 metadata 都存在于 footer 中。
     footer 中的 metadata 包含了格式的版本信息,schema 信息、key-value paris 以及所有 block 中的 metadata 信息。

Striping/assembly算法 嵌套格式的支持,源于dermel论文
 LSM树和B+树

Parquet,另一个常见的列式存储格式是 ORC(OptimizedRC File)。在 ORC 之前,Apache Hive 中就有一种列式存储格式称为 RCFile(RecordColumnar File),
ORC 是对 RCFile 格式的改进,主要在压缩编码、查询性能方面做了优化。因此 ORC/RC 都源于 Hive

spark默认的数据格式是parquet
   一般ACID是面向一些作为查询服务的数据,然而数仓中的数据更多是作为计算和分层流转。hudi却又可以支持parquet的update操作

 parquet  protobuf

读写parquet

 import pyarrow.parquet as pq
 pq_array = pa.parquet.read_table("area1.parquet", memory_map=True)
 # The functions read_table() and write_table() read and write the pyarrow.Table object, respectively.

序列化结构数据

 序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它依据流重构对象
 protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储
   通信时所传递的信息是通过Protobuf定义的message数据结构进行打包,然后编译成二进制的码流再进行传输或者存
C++
    1.Boost.Serialization Boost.Serialization能够创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者实用户自己定义的其它文件。
	2.Google Protocol Buffers
Java序列化:Java序列化、Hessian、Json等序列化方式,
      1.Java原生序列化 Java类通过实现Serializable接口来实现该类 
      2.Hessian是一个支持跨语言传输的二进制文本序列化协议,对比Java默认的序列化,Hessian的使用较简单,		  
      3.Fastjson序列化fastjson 是由阿里巴巴开发的一个性能很好的Java 语言实现的 Json解析器和生成器
      4.Kyro序列化是主流的比较成熟的序列化方案之一,目前广泛使用在大数据组件中
      5.protocol	
 python
    1.pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议
    2.python中有json模块。
	3.protocol
	  1.安装protobuf 2.pip安装 pip3 install protobuf  3.根据协议生成python文件  4.引入脚本,使用api

符号计算与数值计算

符号计算软件
    Mathematica 和 MATLAB、Maple 并称为三大数学软件 

	
01.公式编辑软件-输入公式
	    Latex、Maple、Mathematica、Word、Mathtype
	    数学公式编辑器软件 mathtype
		   MathType曾作为Microsoft Word内置公式编辑器
	    axmath
	      https://www.amyxun.com/
	    https://www.mathcha.io/
	 亿图公式编辑器 PC端 https://math.edrawsoft.cn/	
	    万兴科技旗下亿图软件 https://mm.edrawsoft.cn/
		国家规划布局内重点软件企业

02.流程图绘制软件	
	 微软 Visio 流程图软件
     drawio——一款开源免费的流程图绘制软件		 
	 Origin 是由OriginLab公司开发的一个科学绘图、数据分析软件,支持在Microsoft Windows下运行	

  
sympy
  Sympy是一个符号计算的Python库 由Python写成,不依赖于外部库	  
  pip3 install sympy
scipy  
  scipy.optimize.linprog
  scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)

参考

https://arrow.apache.org/docs/python/parquet.html
https://code.google.com/archive/p/plumgo/wikis/HSNNS_ObjectSerialization.wiki
 ROS_解析protobuf https://www.cnblogs.com/ytwang/p/16911968.html