DuckDB: 从MySql导出数据至Parquet文件

在这篇文章中,介绍使用DuckDB将数据从MySQL数据库无缝传输到Parquet文件的过程。该方法比传统的基于pandas方法更高效、方便,我们可以从DuckDB cli实现,也可以结合Python编程方式实现,两者执行核心SQL及过程都一样。

Parquet格式优势

Parquet 文件格式是一种开源的列存储文件格式,由 Apache Hadoop 生态系统中的 Apache Parquet 项目开发。
在这里插入图片描述
其优势主要体现为下面四个方面。

  1. 存储方面

列式存储:只读取需要的数据,降低 IO 数据量,速度快。比如在一个包含众多列的大数据表中,若只需查询其中几列数据,Parquet 格式可直接定位到这些列进行读取,而无需像行式存储那样读取整行数据134。

压缩比高:由于按列存储,可以使用更高效的压缩编码,如 Run Length Encoding 和 Delta Encoding 等,进一步节约存储空间,通常能比相同数据的行式存储格式节省大量空间14。

自带 Schema:Parquet 文件包含了元数据信息,其中的 schema 和 structure 信息可以通过数据文件解析出来,这使得数据的读取和理解更加方便,也便于不同系统之间的数据共享和交换1。

  1. 查询性能方面

数据跳过功能:在执行查询时,可以快速跳过与查询条件不相关的数据块,减少不必要的数据扫描,提高查询效率,尤其在处理大规模数据时优势明显。

支持谓词下推:当执行查询时,过滤条件可以被下推到存储层进行处理,而不是在查询引擎中处理,这样可以减少数据的移动和处理量,从而加快查询速度。

聚合操作高效:由于其列存储特性,在执行聚合操作时,如求和、计数等,能够快速访问所需的列数据,相比行式存储格式性能更优3。

  1. 兼容性与灵活性方面

跨平台支持:Parquet 文件可以被多种数据处理工具和平台读取和写入,如 Apache Spark、Apache Hive、Apache Impala 以及 Python 的 Pandas 等,提高了数据的可移植性和互操作性3。

支持复杂数据类型和结构:能够高效地存储和查询复杂的嵌套数据结构,如 JSON 格式的数据,以及包含数组、结构体等复杂类型的数据3。

语言支持广泛:有多种编程语言的库和接口支持,如 Java、Python、C++、C# 等,方便在不同语言环境下进行数据的读写和处理。

  1. 数据管理方面

支持模式演进:可以在不重写整个文件的情况下修改 Parquet 文件的模式,方便添加新列或更改现有列的数据类型,易于应对数据结构的变化。

数据治理友好:支持细粒度的访问控制和数据加密,适合存储敏感数据,为数据治理和合规性提供了保障。

安装MySQL扩展

mysql扩展允许DuckDB直接从运行的mysql实例中读写数据。数据可以直接从底层MySQL数据库查询。数据可以从MySQL表加载到DuckDB表,反之亦然。

INSTALL mysql;
LOAD mysql;

配置MySQL连接

MySQL连接字符串决定了如何以一组键=值对的形式连接到MySQL的参数。任何未提供的选项都将被其默认值替换,如下表所示。还可以使用环境变量指定连接信息。如果没有显式提供选项,MySQL扩展将尝试从环境变量中读取该选项。

SettingDefaultEnvironment variable
databaseNULLMYSQL_DATABASE
hostlocalhostMYSQL_HOST
password MYSQL_PWD
port0MYSQL_TCP_PORT
socketNULLMYSQL_UNIX_PORT
user⟨current user⟩MYSQL_USER
ssl_modepreferred
ssl_ca
ssl_capath
ssl_cert
ssl_cipher
ssl_crl
ssl_crlpath
ssl_key

要使MySQL数据库可以被DuckDB访问,可以使用ATTACH命令结合连接参数实现:

ATTACH 'host=localhost user=root password=passw0rd port=3306 database=saklia' AS saklia (TYPE MYSQL);
USE saklia;

复制MySQL数据至DuckDB

D create or replace table film_copy as from saklia.sakila.film;

D desc film_copy;
{"column_name":"film_id","column_type":"USMALLINT","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"title","column_type":"VARCHAR","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"description","column_type":"VARCHAR","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"release_year","column_type":"INTEGER","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"language_id","column_type":"UTINYINT","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"original_language_id","column_type":"UTINYINT","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"rental_duration","column_type":"UTINYINT","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"rental_rate","column_type":"DECIMAL(4,2)","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"length","column_type":"USMALLINT","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"replacement_cost","column_type":"DECIMAL(5,2)","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"rating","column_type":"VARCHAR","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"special_features","column_type":"VARCHAR","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"last_update","column_type":"TIMESTAMP WITH TIME ZONE","null":"YES","key":null,"default":null,"extra":null}

## 查看记录数
D select count(*) from film_copy;
{"count_star()":1000}

导出Parquest格式数据

使用copy to 语句导出文件,然后查询数据结构及记录数:

D copy film_copy to film.parquet;

## 确认并验证
D select count(*) from read_parquet('film.parquet');
{"count_star()":1000}

D desc from read_parquet('film.parquet');
{"column_name":"film_id","column_type":"USMALLINT","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"title","column_type":"VARCHAR","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"description","column_type":"VARCHAR","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"release_year","column_type":"INTEGER","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"language_id","column_type":"UTINYINT","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"original_language_id","column_type":"UTINYINT","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"rental_duration","column_type":"UTINYINT","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"rental_rate","column_type":"DECIMAL(4,2)","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"length","column_type":"USMALLINT","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"replacement_cost","column_type":"DECIMAL(5,2)","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"rating","column_type":"VARCHAR","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"special_features","column_type":"VARCHAR","null":"YES","key":null,"default":null,"extra":null}
{"column_name":"last_update","column_type":"TIMESTAMP WITH TIME ZONE","null":"YES","key":null,"default":null,"extra":null}

可以看到与之前结果一致。如果数据量很大,我们还可以实现hive分区,参考代码如下:

COPY (
SELECT *,
date_trunc('day', rundate) AS rundate_truncated
FROM bike_readings_april
) TO 'bike_readings'(
FORMAT PARQUET,
PARTITION_BY (rundate_truncated),
OVERWRITE_OR_IGNORE true
);

将导出文件拆分为多个Parquet文件可以简化存储,并通过减少扫描和处理的数据量来提高需要读取数据的系统的性能。Hive分区通常用于数据湖存储,用于分布式SQL查询引擎的高效检索,可以利用分区键来减少需要扫描的文件数量。

总结

驾驭复杂的数据提取和格式转换不仅需要技能,还需要合适的工具。通过本文介绍,我们看到DuckDB如何简化数据导出过程,提供了从MySQL到Parquet的无缝对接方式。通过保持数据完整性、自动处理数据类型和消除繁琐的数据类型转换,DuckDB为数据工程师提供了引人注目的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

safe area helper插件

概述 显示不同机型的必能显示的区域 实现步骤 引入safearea,引入其中的safearea的csharp 为cancas加入gameobject gameobject中加入safearea脚本 将UI作为这个gameobject的子物体,就可以完成显示

数据结构 ——二叉树转广义表

数据结构 ——二叉树转广义表 1、树转广义表 如下一棵树&#xff0c;转换为广义表 root(c(a()(b()()))(e(d()())(f()(j(h()())())))) (根&#xff08;左子树&#xff09;&#xff08;右子树&#xff09;) 代码实现 #include<stdio.h> #include<stdlib.h>//保存…

实现echart大屏动画效果及全屏布局错乱解决方式

如何实现echarts动画效果?如何实现表格或多个垂直布局的柱状图自动滚动效果?如何解决tooltip位置超出屏幕问题,如何解决legend文字过长,布局错乱问题?如何处理饼图的中心图片永远居中? 本文将主要解决以上问题,如有错漏,请指正. 一、大屏动画效果 这里的动画效果主要指&…

【YashanDB知识库】如何处理yasql输入交互模式下单行字符总量超过限制4000字节

现象 在yasql执行sql语句后报错&#xff1a;YASQL-00021 input line overflow (>4000 byte at line 4) 原因 yasql在交互模式模式下单行字符总量限制4000字节&#xff0c;超出该限制即报错。 交互式模式下&#xff0c;yasql会显示一个提示符&#xff0c;通常是 SQL>…

DALL·E 2(内含扩散模型介绍)-生成式模型【学习笔记】

视频链接&#xff1a;DALLE 2&#xff08;内含扩散模型介绍&#xff09;【论文精读】_哔哩哔哩_bilibili&#xff08;up主讲的非常好&#xff0c;通俗易懂&#xff0c;值得推荐&#xff09; 目录 1、GAN模型 2、VAE模型 2.1、AE&#xff08;Auto-Encoder&#xff09; 2.2、…

FPGA 16 ,Verilog中的位宽:深入理解与应用

目录 前言 一. 位宽的基本概念 二. 位宽的定义方法 1. 使用向量变量定义位宽 ① 向量类型及位宽指定 ② 位宽范围及位索引含义 ③ 存储数据与字节数据 2. 使用常量参数定义位宽 3. 使用宏定义位宽 4. 使用[:][-:]操作符定义位宽 1. 详细解释 : 操作符 -: 操作符 …

使用 Vue3 实现摄像头拍照功能

参考资料:MediaDevices.getUserMedia() - Web API | MDN 重要: navigator.mediaDevices.getUserMedia 需要在安全的上下文中运行。现代浏览器要求摄像头和麦克风的访问必须通过 HTTPS 或 localhost&#xff08;被视为安全的本地环境&#xff09;进行,如果上传服务器地址是http…

2024安装hexo和next并部署到github和服务器最新教程

碎碎念 本来打算写点算法题上文所说的题目&#xff0c;结果被其他事情吸引了注意力。其实我之前也有过其他博客网站&#xff0c;但因为长期不维护&#xff0c;导致数据丢失其实是我懒得备份。这个博客现在部署在GitHub Pages上&#xff0c;github不倒&#xff0c;网站不灭&…

RTMP推流平台EasyDSS在无人机推流直播安防监控中的创新应用

无人机与低空经济的关系密切&#xff0c;并且正在快速发展。2024年中国低空经济行业市场规模达到5800亿元&#xff0c;其中低空制造产业占整个低空经济产业的88%。预计未来五年复合增速将达到16.03%。 随着科技的飞速发展&#xff0c;公共安防关乎每一个市民的生命财产安全。在…

java全栈day16--Web后端实战(数据库)

一、数据库介绍 二、Mysql安装&#xff08;自行在网上找&#xff0c;教程简单&#xff09; 安装好了进行Mysql连接 连接语法&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroot -p密码 方法二&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroo…

基于注意力的几何感知的深度学习对接模型 GAABind - 评测

GAABind 作者是苏州大学的生物基础与医学院, 期刊是 Briefings in Bioinformatics, 2024, 25(1), 1–14。GAABind 是一个基于注意力的几何感知蛋白-小分子结合模式与亲和力预测模型,可以捕捉小分子和蛋白的几何、拓扑结构特征以及相互作用。使用 PDBBind2020 和 CASF2016 作…

【CSS in Depth 2 精译_080】 13.1:CSS 渐变效果(中)——不同色彩空间的颜色插值算法在 CSS 渐变中的应用

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 13 章 渐变、阴影与混合模式】 ✔️ 13.1 渐变 ✔️ 13.1.1 使用多个颜色节点&#xff08;上&#xff09;13.1.2 颜色插值方法&#xff08;中&#xff09; ✔️13.1…

虚拟机VirtualBox安装最新版本Oracle数据库

https://www.oracle.com/database/technologies/databaseappdev-vm.html 如上所示&#xff0c;从Oracle官方网站上下载最新版本的VirtualBox虚拟机对应的Oracle数据库安装源文件。 如上所示&#xff0c;在VirtualBox中导入下载的Oracle安装源文件。 如上所示&#xff0c;导入…

热更新解决方案4——xLua热补丁

概述 运行时不在执行C#中的代码&#xff0c;而是执行Lua中的代码&#xff0c;相当于是打了个补丁。 1.第一个热补丁 2.多函数替换 3.协程函数替换 在原HotfixMain脚本中只加个协程函数即可&#xff08;和在Start中启动协程函数&#xff09; 4.索引器和属性替换 在HotfixMain中…

突破长链视觉推理瓶颈:Insight-V多智能体架构解析

GitHub 仓库&#xff1a;https://github.com/dongyh20/Insight-V HuggingFace 模型库&#xff1a;https://huggingface.co/THUdyh/Insight-V arXiv 技术论文&#xff1a;https://arxiv.org/pdf/2411.14432 模型&#xff1a;https://huggingface.co/THUdyh/Insight-V-Reason 今天…

IDEA 未启用lombok插件的Bug

项目中maven已引用了lombok依赖&#xff0c;之前运行没有问题的&#xff0c;但有时启动会提示&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…

AI工具如何深刻改变我们的工作与生活

在当今这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经从科幻小说中的概念变成了我们日常生活中不可或缺的一部分。从智能家居到自动驾驶汽车&#xff0c;从医疗诊断到金融服务&#xff0c;AI正以惊人的速度重塑着我们的世界。 一、工作方式的革新…

压力测试Jmeter简介

前提条件&#xff1a;要安装JDK 若不需要了解&#xff0c;请直接定位到左侧目录的安装环节。 1.引言 在现代软件开发中&#xff0c;性能和稳定性是衡量系统质量的重要指标。为了确保应用程序在高负载情况下仍能正常运行&#xff0c;压力测试变得尤为重要。Apache JMeter 是一…

手眼标定工具操作文档

1.手眼标定原理介绍 术语介绍 手眼标定&#xff1a;为了获取相机与机器人坐标系之间得位姿转换关系&#xff0c;需要对相机和机器人坐标系进行标定&#xff0c;该标定过程成为手眼标定&#xff0c;用于存储这一组转换关系的文件称为手眼标定文件。 ETH&#xff1a;即Eye To …

vue 自定义组件image 和 input

本章主要是介绍自定义的组件&#xff1a;WInput&#xff1a;这是一个验证码输入框&#xff0c;自动校验&#xff0c;输入完成回调等&#xff1b;WImage&#xff1a;这是一个图片展示组件&#xff0c;集成了缩放&#xff0c;移动等操作。 目录 一、安装 二、引入组件 三、使用…