数据库_duckdb读写Parquet文件
基本概念
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
分类:
SQL_数据仓库
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)