使用DuckDB 加载和清洗数据

news2024/12/16 4:33:10

DuckDB CLI是允许用户直接从命令行与DuckDB交互的工具。前文你看到了如何使用Python与DuckDB交互。但是,有时你只是想直接使用数据库—例如在创建新表、从不同数据源导入数据以及执行与数据库相关的任务时。在这种情况下,直接使用DuckDB CLI要有效得多。本文介绍Duck cli,并使用命令行工具加载数据、清洗数据。
在这里插入图片描述

安装duck cli

DuckDB命令行已经针对Windows、macOS和Linux三种平台进行了预编译。有关为你的平台安装DuckDB CLI的说明,请参阅官网安装页面。

对于Windows,您可以在命令提示符下使用Windows包管理器下载DuckDB CLI:

winget install DuckDB.cli

一旦下载了DuckDB命令行,你可以用下面的语法来使用它:

$ duckdb [OPTIONS] [FILENAME]

你可以从DuckDB网站获得命令行参数选项的完整列表。或者直接使用-help选项来显示选项列表:

 duckdb -help
Usage: D:\software\duckdb\duckdb.exe [OPTIONS] FILENAME [SQL]
FILENAME is the name of an DuckDB database. A new database is created
if the file does not previously exist.
OPTIONS include:
   -append              append the database to the end of the file
   -ascii               set output mode to 'ascii'
   -bail                stop after hitting an error
   -batch               force batch I/O
   -box                 set output mode to 'box'
   -column              set output mode to 'column'
   -cmd COMMAND         run "COMMAND" before reading stdin
   -c COMMAND           run "COMMAND" and exit
   -csv                 set output mode to 'csv'
   -echo                print commands before execution
   -init FILENAME       read/process named file
   -[no]header          turn headers on or off
   -help                show this message
   -html                set output mode to HTML
   -interactive         force interactive I/O
   -json                set output mode to 'json'
   -line                set output mode to 'line'
   -list                set output mode to 'list'
   -markdown            set output mode to 'markdown'
   -newline SEP         set output row separator. Default: '\n'
   -nofollow            refuse to open symbolic links to database files
   -no-stdin            exit after processing options instead of reading stdin
   -nullvalue TEXT      set text string for NULL values. Default ''
   -quote               set output mode to 'quote'
   -readonly            open the database read-only
   -s COMMAND           run "COMMAND" and exit
   -separator SEP       set output column separator. Default: '|'
   -stats               print memory stats before each finalize
   -table               set output mode to 'table'
   -unredacted          allow printing unredacted secrets
   -unsigned            allow loading of unsigned extensions
   -version             show DuckDB version

如果不提供FILENAME参数,DuckDB命令行将打开一个临时内存数据库,并显示版本号、连接信息和以D开头的提示符:

 duckdb
v1.0.0 1f98600c2c
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D

在创建内存数据库时,在退出DuckDB CLI时将丢失所有内容。因此,这个选项只有在您想要尝试DuckDB的工作方式时才有用,在按“Ctrl+C”可以退出DuckDB命令行窗户。

DuckDB CLI更常见的用法是用于持久数据库,从而保证跨会话能保存数据,允许长期使用和重用,而无需每次重新加载或重新处理数据。

下面的示例展示了如何将DuckDB命令行与持久数据库(名为mydb.duckdb)一起使用:

duckdb mydb.duckdb
v1.0.0 1f98600c2c
Enter ".help" for usage hints.
D

现在已经创建了数据库,你可以学习如何将数据导入到数据库中。

从本地文件加载数据

首先我们创建目标表,.tables命令可以查看所有表,desc 命令可以查看表字段信息:

D create table orders(  order_id int4, product varchar, quantity int4,  price float, order_date date);
D .tables
orders
D desc orders;
┌─────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │  null   │   key   │ default │  extra  │
│   varchar   │   varchar   │ varchar │ varchar │ varchar │ varchar │
├─────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ order_id    │ INTEGER     │ YES     │         │         │         │
│ product     │ VARCHAR     │ YES     │         │         │         │
│ quantity    │ INTEGER     │ YES     │         │         │         │
│ price       │ FLOAT       │ YES     │         │         │         │
│ order_date  │ DATE        │ YES     │         │         │         │
└─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘

要从本地文件加载数据,我们使用COPY命令,就像下面的代码示例一样,它加载一个CSV文件:

D COPY orders FROM 'data.csv' with (HEADER, DELIMITER ',');
D select * from orders;
┌──────────┬────────────────────────────┬──────────┬────────┬────────────┐
│ order_id │          product           │ quantity │ price  │ order_date │
│  int32   │          varchar           │  int32   │ float  │    date    │
├──────────┼────────────────────────────┼──────────┼────────┼────────────┤
│   176558 │ USB-C Charging Cable       │        2 │  11.95 │ 2019-04-19 │
│   176559 │ Bose SoundSport Headphones │        1 │  99.99 │ 2019-04-07 │
│   176560 │ Google Phone               │        1 │  600.0 │ 2019-04-12 │
│   176560 │ Wired Headphones           │        1 │  11.99 │ 2019-04-12 │
│   176561 │ Wired Headphones           │        1 │  11.99 │ 2019-04-30 │
│   176562 │ USB-C Charging Cable       │        1 │  11.95 │ 2019-04-29 │
│   176563 │ Bose SoundSport Headphones │        1 │  99.99 │ 2019-04-02 │
│   176564 │ USB-C Charging Cable       │        1 │  11.95 │ 2019-04-12 │
│   176565 │ Macbook Pro Laptop         │        1 │ 1700.0 │ 2019-04-24 │
└──────────┴────────────────────────────┴──────────┴────────┴────────────┘

从远程加载数据

等等,如果你的数据不能在本地下载怎么办?不用担心,我们也可以从远程数据源加载数据,DuckDB为一堆数据库和数据源提供了连接器。下面是从远程PostgreSQL数据库加载数据的例子:

CREATE SERVER my_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'my_host', dbname 'my_db');

CREATE USER MAPPING FOR current_user SERVER my_server
OPTIONS (user 'my_user', password 'my_password');

IMPORT FOREIGN SCHEMA public FROM SERVER my_server INTO my_schema;

SELECT *
INTO my_table
FROM my_schema.my_remote_table;

上面我们使用CREATE server语句创建了一个到PostgreSQL数据库的服务器连接。然后,我们使用CREATE user mapping语句建立具有必要凭据的用户映射。最后,我们导入外部模式,并使用IMPORT foreign schema和SELECT into语句将所需的数据加载到本地表。

现在你可能会想,我的数据分散在Hive分区Parquet文件中。DuckDB还能导入它吗?令人震惊的是,答案是肯定的。让我们尝试用一个Hive分区的目录结构来处理事件:

SELECT * FROM parquet_scan('events/*/*/*.parquet', hive_partitioning=1);

这将从events/目录下的Hive分区数据集中读取数据。

分区在数据集很大且查询模式涉及基于特定属性过滤或聚合数据的情况下特别有用。例如,对时间序列、地理数据、分类数据和增量更新的查询可以通过不加载整个数据集来基于分区列进行查询而获益。

数据转换

DuckDB提供了广泛的SQL函数和表达式来帮助进行数据转换和清理。下面是一些例子:

  • 使用COALESCE清理缺失值:
select coalesce(product,'a') as product from orders;
┌────────────────────────────┐
│          product           │
│          varchar           │
├────────────────────────────┤
│ USB-C Charging Cable       │
│ Bose SoundSport Headphones │
│ Google Phone               │
│ Wired Headphones           │
│ Wired Headphones           │
│ USB-C Charging Cable       │
│ Bose SoundSport Headphones │
│ USB-C Charging Cable       │
│ Macbook Pro Laptop         │
└────────────────────────────┘
  • 使用distinct删除重复数据
D select distinct product from orders;
┌────────────────────────────┐
│          product           │
│          varchar           │
├────────────────────────────┤
│ Google Phone               │
│ Macbook Pro Laptop         │
│ USB-C Charging Cable       │
│ Bose SoundSport Headphones │
│ Wired Headphones           │
└────────────────────────────┘
  • 转换字符串日期
D SELECT strptime('02/03/1992', '%d/%m/%Y');
┌────────────────────────────────────┐
│ strptime('02/03/1992', '%d/%m/%Y') │
│             timestamp              │
├────────────────────────────────────┤
│ 1992-03-02 00:00:00                │
└────────────────────────────────────┘

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux部署ansible自动化运维

ansible自动化运维 1,编写ansible的仓库(比赛已经安装,无需关注) 1、虚拟机右击---设置---添加---CD/DVD驱动器---完成---确定 2、将ansible.iso的光盘连接上(右下角呈绿色状态) 3、查看光盘挂载信息 df -h…

vue3-tp8-Element:对话框实现

效果 参考框架 Dialog 对话框 | Element Plus 具体实现 一、建立view页面 /src/views/TestView.vue 二、将路径写入路由 /src/router/index.js import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vueconst router create…

YOLOv11改进,YOLOv11添加DLKA-Attention可变形大核注意力,WACV2024 ,二次创新C3k2结构

摘要 作者引入了一种称为可变形大核注意力 (D-LKA Attention) 的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKA Attention 还受益于可变形卷积,以适应不同的数据模式。 理论介绍 大核卷积(Large Kernel Convolu…

Python数据分析案例67——因子分析回归分析

背景 线性回归,主成分回归都做烂了,我之前的案例有很多这些模型,但是一直没写因子分析的回归案例,这个也是传统统计学流行的方法,在金融经济心理学等人文社科用得非常多。这个案例就演示一下python怎么做因子分析。 数…

FastAPI简介

FastAPI简介 一、FastAPI简介二、FastAPI安装2.1 使用pip安装FastAPI2.2 FastAPI的demo2.3 FastAPI的程序结构 三、装饰器请求方法四、用户请求4.1 路径参数4.1.1 单个路径参数4.1.2 多个路径参数4.1.3 固定路径和路径参数的冲突 4.2 查询参数4.3 默认参数4.4 可选参数 五、请求…

Django结合websocket实现分组的多人聊天

其他地方和上一篇大致相同,上一篇地址点击进入, 改动点1:在setting.py中最后再添加如下配置: # 多人聊天 CHANNEL_LAYERS {"default":{"BACKEND": "channels.layers.InMemoryChannelLayer"} }因此完整的se…

基础学习:(5)不同卷积:transposed convolution,deconvolution,dilated convolution

基础学习:(5)不同卷积 文章目录 基础学习:(5)不同卷积前言1 deconvlution transposed convolution2 对比2.1 Convolution animations2.2 Transposed convolution animations2.3 Dilated convolution 前言 …

Windows安装Jira

下载 Download Jira Data Center | Atlassian https://product-downloads.atlassian.com/software/jira/downloads/atlassian-jira-software-10.3.0-x64.exe 以管理员身份安装,否则弹出以下提醒 创建和配置MySQL数据库:参照 Connecting Jira applicat…

采用qL-MPC技术进行小型固定翼无人机的路径跟随控制

来自论文"Predictive Path-Following Control for Fixed-Wing UAVs Using the qLMPC Framework in the Presence of Wind Disturbances" 控制架构 采用的是 ULTRA-Extra无人机,相关参数如下: 这里用于guidance law的无人机运动学模型为&#…

计算机毕设-基于springboot的青少年心理健康教育网站的设计与实现(附源码+lw+ppt+开题报告)

博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

28.在 Vue 3 中使用 OpenLayers 加载 MVT 格式矢量瓦片数据并显示图形

前言 随着前端开发技术的不断进步,越来越多的强大地图库被广泛应用于 Web 地图应用开发中。OpenLayers 是一个流行的开源 JavaScript 库,能够帮助开发者快速构建交互式地图应用。而 Vue 3 作为现代化的前端框架,已经成为开发者构建高效、响应…

Linux - MySQL迁移至一主一从

Linux - MySQL迁移至一主一从 迁移准备安装MySQL ibd文件迁移原服务器操作目标服务器操作 一主一从增量同步异常解决结尾 首先部分单独安装MySQL,请参考Linux - MySQL安装,迁移数据量比较大约400G左右且网络不通故使用文件迁移,需开启一段时间…

opencv-python的简单练习

题目1.读取一张彩色图像并将其转换为灰度图。 import cv2 # 读取图片文件 img cv2.imread(./1.png)# 将原图灰度化 img_gray cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 输出图片 cv2.imshow(img,img) cv2.imshow(img_g,img_gray) # 进行阻塞 cv2.waitKey(0) 题目2:…

go-zero(十三)使用MapReduce并发

go zero 使用MapReduce并发 一、MapReduce 介绍 MapReduce 是一种用于并行计算的编程模型,特别适合在大规模数据处理场景中简化逻辑代码。 官方文档: https://go-zero.dev/docs/components/mr 1. MapReduce 的核心概念 在 MapReduce 中,主…

探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程

一、摘要 在当今的数字化时代,软件开发就像是一场探险,每个开发者都是探险家,探索着代码的奥秘。React作为前端开发的领军框架,其组件化和高效的渲染机制为开发者提供了强大的工具。而Microi吾码低代码平台的出现,则为…

SAP FICO物料分类账实操

物料分类账所涉及到的差异从采购入库的时候就可能已经产生,接下来从创建物料主数据开始对可能产生差异地方进行分析。其中有些操作步骤在标准价格估算这一篇博文中已经有过演示,可以先做了解。 其中的某些创建在有直接可用的情况下是非必须的&#xff0…

WordPress酱茄主题 开源版 博客资讯自媒体网站模板

一款免费开源的WordPress主题,主题专为WordPress博客、资讯、自媒体网站而设计 运行环境 支持WordPress版本:5.6 兼容Chrome、Firefox、Safari等主流浏览器 支持设备:响应式布局,不同设备不同展示效果 服务器环境建议&#x…

【HF设计模式】03-装饰者模式

声明:仅为个人学习总结,还请批判性查看,如有不同观点,欢迎交流。 摘要 《Head First设计模式》第3章笔记:结合示例应用和代码,介绍装饰者模式,包括遇到的问题、遵循的 OO 原则、达到的效果。 …

Linux查看是否有www-data用户,如果没有添加一个

在 Linux 系统中,www-data 用户通常是用来运行 Web 服务(如 Nginx 或 Apache)的。如果你想检查系统中是否已经存在 www-data 用户,并在没有的情况下添加一个,可以按照以下步骤操作: ### 1. 检查 www-data …

23.模块和包

模块 模块Module,是一个python文件,以.py结尾。 模块能定义函数、类和变量。 模块导入 模块在使用前需要先导入 [from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名] import 模块 import time print("start...") time.sleep(5) print(&…