duckdb 连接postgres 和 jdbc 的使用

news2024/12/23 18:46:29

why?

主要是特别快

  • 嵌入式,不需要服务器,使用超级方便

  • 扩展机制灵活,可以直接读取CSV、JSON、Parquet等文件

    Parquet文件格式详解(含行、列式存储区别)_parquet格式-CSDN博客

  • 采用列式存储(用于高效聚合)及向量化处理(用于提高性能)功能

1.下载

https://github.com/duckdb/duckdb/releases

duckdb_cli-windows-amd64.zip

2. 安装扩展和使用

2.1 直接使用命令行

D:\soft\pgsql>duckdb.exe
v1.1.0 fa5c2fe15f
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.

安装扩展:

postgres 扩展 PostgreSQL Extension – DuckDB

mysql 扩展 MySQL Extension – DuckDB

下边以 postgres 扩展 为例:

 -- 安装扩展 postgres 扩展
 INSTALL postgres;

 -- duckdb 会默认下载扩展并安装在
 -- C:\Users\xueji\.duckdb\extensions\v1.1.0\windows_amd64

 -- 加载扩展
 LOAD postgres;

 -- 查询是否安装扩展 注意【installed=true】
 SELECT extension_name, installed, description FROM duckdb_extensions();

 SELECT extension_name, installed FROM duckdb_extensions() where installed=true;
┌──────────────────┬───────────┐
│  extension_name  │ installed │
│     varcharboolean  │
├──────────────────┼───────────┤
│ autocomplete     │ true      │
│ fts              │ true      │
│ icu              │ true      │
│ json             │ true      │
│ parquet          │ true      │
│ postgres_scanner │ true      │
│ shell            │ true      │
│ tpch             │ true      │
└──────────────────┴───────────┘

 -- 连接到postgres
 ATTACH 'dbname=postgres user=postgres  password=123456 host=127.0.0.1  port=5433' AS db (TYPE POSTGRES, SCHEMA 'public');
-- 显示所有数据库 https://duckdb.org/docs/configuration/pragmas.html
 PRAGMA database_list;
┌───────┬─────────┬──────────────────────────────────────────────────────────────────────────┐
│  seq  │  name   │                                   file                                   │
│ int64 │ varcharvarchar                                  │
├───────┼─────────┼──────────────────────────────────────────────────────────────────────────┤
│  1148 │ memory  │                                                                          │
│  2114 │ db      │ dbname=postgres user=postgres  password=123456 host=127.0.0.1  port=5433 │
└───────┴─────────┴──────────────────────────────────────────────────────────────────────────┘

 -- 显示所有表
 SHOW ALL TABLES;


┌──────────┬─────────┬────────────────┬──────────────────────┬─────────────────────────────────────────────┬───────────┐
│ databaseschema  │      name      │     column_names     │                column_types                 │ temporary │
│ varcharvarcharvarcharvarchar[]varchar[]boolean  │
├──────────┼─────────┼────────────────┼──────────────────────┼─────────────────────────────────────────────┼───────────┤
│ db       │ public  │ accounts       │ [id, client, amount][BIGINT, VARCHAR, DOUBLE]false     │
│ db       │ public  │ cacheme        │ [id][INTEGER]false     │
│ db       │ public  │ demo           │ [id, name, str_arr…  │ [INTEGER, VARCHAR, VARCHAR[], INTEGER[], …  │ false     │
│ db       │ public  │ hot            │ [id, s][INTEGER, VARCHAR]false     │
│ db       │ public  │ pg_buffercache │ [bufferid, relfile…  │ [INTEGER, UINTEGER, UINTEGER, UINTEGER, S…  │ false     │
│ db       │ public  │ student        │ [id, name, age][INTEGER, VARCHAR, INTEGER]false     │
│ db       │ public  │ t              │ [id, s][INTEGER, VARCHAR]false     │
│ db       │ public  │ tfreeze        │ [id, s][INTEGER, VARCHAR]false     │
│ db       │ public  │ vac            │ [id, s][INTEGER, VARCHAR]false     │
└──────────┴─────────┴────────────────┴──────────────────────┴─────────────────────────────────────────────┴───────────┘

-- 此处注意 {database}.{schema}.{name} 是表的访问路径
-- db.public.student 表示 
-- database=db
-- schema=public

-- 查询student 表
select * from db.public.student;

-- 导出数据为csv 
copy db.public.student to 'd:\student.csv' with(header, delimiter '|');


-- 导出部分数据
copy (select * from db.public.student limit 10) to 'd:\student.csv' with(header, delimiter '|');

-- 直接查询csv 文件
 select * from 'd:\student.csv' limit 10;
┌───────┬─────────┬───────┐
│  id   │  name   │  age  │
│ int64 │ varchar │ int64 │
├───────┼─────────┼───────┤
│     1 │ 张三    │    23 │
│     2 │ 李四    │    24 │
│     3 │ 王五    │    25 │
│     4 │ 赵六    │    26 │
└───────┴─────────┴───────┘ 

--分组查询

select count(*),max(age) from 'd:\student.csv' limit 10;
┌──────────────┬──────────┐
│ count_star()max(age) │
│    int64     │  int64   │
├──────────────┼──────────┤
│            426 │
└──────────────┴──────────┘

 -- 读取csv 查询结果并把结果保存到表
create table main.test1 as select count(*) cnt ,max(age) m from 'd:\student.csv';

-- 查询新生成的表
select * from memory.main.test1;
┌───────┬───────┐
│  cnt  │   m   │
│ int64 │ int64 │
├───────┼───────┤
│     426 │
└───────┴───────┘


-- 导出为 Parquet格式
copy db.public.student to 'd:\test.parquet' (format 'parquet');

-- 使用文件名查询
select count(*) from 'd:\test.parquet';

-- 部分导出
copy (select * from db.public.student where id<=2) to 'd:\student1.parquet' (format 'parquet');
copy (select * from db.public.student where id>2)  to 'd:\student2.parquet' (format 'parquet');


-- 使用文件通配符查询,可以查询多个文件
select count(*) from 'd:\student*.parquet';
-- 读取 多个 parquet 查询结果并把结果保存到表
create table main.test2 as select count(*) cnt ,max(age) m from 'd:\student*.parquet';
-- 查询内部表
select * from memory.main.test1;


-- 也可以在duckdb 直接插入到postges 中
insert into db.public.demo(id,name) values(8,'duckdb');
-- 查询插入的数据
select id,name from db.public.demo where id=8;
┌───────┬─────────┐
│  id   │  name   │
│ int32 │ varchar │
├───────┼─────────┤
│     8 │ duckdb  │
└───────┴─────────┘

扩展安装的地址

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

认识DuckDB | 遇码MeetCoding

2.2 在java中使用

2.2.1 引入 maven包

DuckDB Installation – DuckDB

Maven Repository: org.duckdb » duckdb_jdbc

 <dependency>
	<groupId>org.duckdb</groupId>
	<artifactId>duckdb_jdbc</artifactId>
    <!-- 目前1.1.0 在window 上测试有bug -->
	<version>1.0.0</version> 
 </dependency>
2.2.2 使用jdbc

D:\work20220906\java\myopen\work20240821\async-demo202402\src\test\java\com\xue\duckdb\DuckdbTest.java

package com.xue.duckdb;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * 
 * @date 2024年9月13日 10:13:13
 */
public class DuckdbTest {
	// https://duckdb.org/docs/api/java.html
	public static void main(String[] args) throws Exception {
		Class.forName("org.duckdb.DuckDBDriver");
		Connection conn = DriverManager.getConnection("jdbc:duckdb:");
		// create a table
		Statement stmt = conn.createStatement();
		stmt.execute("CREATE TABLE items (item VARCHAR, value DECIMAL(10, 2), count INTEGER)");
		// insert two items into the table
		stmt.execute("INSERT INTO items VALUES ('jeans', 20.0, 1), ('hammer', 42.2, 2)");

		try (ResultSet rs = stmt.executeQuery("SELECT * FROM items")) {
			while (rs.next()) {
				System.out.printf("%s  %04f  %03d\n", rs.getString(1), rs.getDouble(2), rs.getInt(3));
			}
		}

		stmt.execute("INSTALL postgres");
		stmt.execute("LOAD postgres");
		// duckdb_jdbc 1.0.0 可以,但是 无法识别 SCHEMA 选项
		stmt.execute(
				"ATTACH 'dbname=postgres user=postgres  password=123456 host=127.0.0.1  port=5433' AS db (TYPE POSTGRES, READ_ONLY)");
		// duckdb_jdbc 1.1.0 奔溃 参考 https://github.com/duckdb/duckdb-java/issues/81
		// stmt.execute("ATTACH 'dbname=postgres user=postgres password=123456
		// host=127.0.0.1 port=5433' AS db (TYPE POSTGRES, SCHEMA 'public')");

		try (ResultSet rs = stmt.executeQuery("select * from db.public.student")) {
			while (rs.next()) {
				System.out.printf("%05d  %s  %03d\n", rs.getInt(1), rs.getString(2), rs.getInt(1));
			}
		}
		System.out.println("=============导出到csv");
		stmt.execute("copy db.public.student to 'd:/student.csv' with(header, delimiter '|');");
		System.out.println("=============查询csv");
		try (ResultSet rs = stmt.executeQuery("select * from 'd:/student.csv'")) {
			while (rs.next()) {
				System.out.printf("%05d  %s  %03d\n", rs.getInt(1), rs.getString(2), rs.getInt(1));
			}
		}

		stmt.close();

	}

}


执行结果

在这里插入图片描述

Java JDBC API – DuckDB

五分钟玩转超人气OLAP数据库DuckDB | 遇码MeetCoding

3.postgres关于DuckDB 扩展

DuckDB Foreign Data Wrapper for PostgreSQL是一个外数据包装器(FDW),旨在将PostgreSQL与DuckDB数据库文件连接起来。这一工具支持PostgreSQL 9.6至16版本,并且与相同版本的libduckdb完全兼容。通过这一FDW,用户可以在PostgreSQL中直接操作DuckDB的数据,实现数据的无缝集成和高效处理。

DuckDB FDW的核心在于其外数据包装器的实现,它允许PostgreSQL通过标准的SQL接口访问DuckDB的数据。这一技术架构不仅确保了数据的一致性和完整性,还提供了高效的数据传输和处理能力。

https://duckdb.org/docs/guides/database_integration/postgres.html

4.DuckDB 关于 postgres 扩展

The postgres extension allows DuckDB to directly read and write data from a running PostgreSQL database instance. The data can be queried directly from the underlying PostgreSQL database. Data can be loaded from PostgreSQL tables into DuckDB tables, or vice versa. See the official announcement for implementation details and background.
postgres扩展允许 DuckDB 直接从正在运行的 PostgreSQL 数据库实例读取和写入数据。可以直接从底层PostgreSQL数据库查询数据。数据可以从 PostgreSQL 表加载到 DuckDB 表中,反之亦然。实施细节和背景请参见官方公告。

https://duckdb.org/docs/extensions/postgres.html

https://duckdb.org/docs/guides/database_integration/postgres.html

Querying Postgres Tables Directly From DuckDB
直接从 DuckDB 查询 Postgres 表

https://duckdb.org/2022/09/30/postgres-scanner.html

5. 预先卸载数据到parquet 然后又duckdb查询

使用 PostgreSQL 和 duckdb_fdw 实现轻量级 OLAP

https://www.ctyun.cn/developer/article/563275316723781

6. 如何导入数据到duckdb

Importing Data – DuckDB


更多:

  • DuckDB百亿级数据性能测试 | 遇码MeetCoding
  • spring jdbctemplate 集成duckdb - 荣锋亮 - 博客园

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

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

相关文章

边缘计算网关:连接中心计算与边缘设备的重要桥梁-天拓四方

一、边缘计算网关&#xff1a;重新定义信息高速公路的“路标” 边缘计算网关&#xff0c;作为边缘计算生态系统中的核心组件&#xff0c;不仅承载着数据传输的功能&#xff0c;更是智能信息处理的关键节点。它通过分布式计算架构&#xff0c;将数据处理任务前置到网络边缘&…

JDK 收费了,怎么应对?难道 JDK 8 一直用下去吗?

最近遇到一个问题&#xff1a;Oracle JDK 8 在 ARM 机器上性能特别差&#xff01; 我的第一直觉就是是不是 JDK 8 在 ARM 不兼容&#xff1f; 为了研究这个问题&#xff0c;我探究了一圈&#xff0c;主要是找找有没有同行遇到这个问题&#xff0c;在找的过程中呢&#xff0c;发…

基于vue框架的宠物领养系统l3a76(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,宠物信息,宠物领养,宠物品种,团队信息,入团申请,团队活动 开题报告内容 基于Vue框架的宠物领养系统开题报告 一、引言 随着宠物文化的普及和人们对宠物情感的日益加深&#xff0c;宠物领养已成为社会关注的热点之一。然而&#…

# 大模型的第一个杀手级应用场景出来了

大家终于都意识到大模型首先改变的是软件行业自己&#xff0c;而软件的根基是代码生成。代码生成第一波就是AI辅助开发&#xff0c;这个会是大模型第一个杀手级应用。大家苦苦逼问自己的大模型杀手级应用&#xff0c;为什么会是辅助编程&#xff0c;这里说下什么&#xff1a; 必…

利用shuji还原webpack打包源码

0 前言 前段时间做一个银行的项目&#xff0c;是在别人已经打过好多次的基础上继续打&#xff0c;而且时间很短&#xff0c;也是没办法要有产出&#xff0c;这个银行很多站点都是webpack打包&#xff0c;就新学了一个点&#xff1a;利用shuji获取webpack打包站源码&#xff08…

2025届京东校招薪酬全面上调,加薪20%!

就在近日京东官方发布声明&#xff0c;今年 2025 届校招岗位的薪资将全面上调&#xff0c;再次加薪&#xff01;其中&#xff0c;采销、技术、产品等核心岗位薪酬上调不低于20%&#xff0c;产研类岗位更狠&#xff0c;算法岗平均起薪涨幅超75%&#xff0c;硬件和设计等岗位起薪…

2024年06月中国电子学会青少年软件编程(图形化)等级考试试卷(一级)答案 + 解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a;100 题数&#xff1a;37 一、单选题 音乐Video Game1的时长将近8秒&#xff0c;点击一次角色&#xff0c;下列哪个程序不能完整地播放音乐两次&#xff1f;&#xff0…

java实现根据延迟法定退休政策计算退休年龄

一、计算规则 从2025年1月1日起&#xff0c;男职工和原法定退休年龄为五十五周岁的女职工&#xff0c;法定退休年龄每四个月延迟一个月&#xff0c;分别逐步延迟至六十三周岁和五十八周岁&#xff1b;原法定退休年龄为五十周岁的女职工&#xff0c;法定退休年龄每二个月延迟一…

应急响应实战---是谁修改了我的密码?

前言&#xff1a;此次应急响应为真实案例&#xff0c;客户反馈无法通过密码登录服务器&#xff0c;疑似服务器被入侵 0x01 如何找回密码&#xff1f; 客户服务器为windows server2019&#xff0c;运维平台为PVE平台&#xff1b;实际上无论是windows系统或者是linux系统&#…

从简单分析到智能问数,Smartbi AIChat让数据回归业务

大数据产业创新服务媒体 ——聚焦数据 改变商业 在某科技公司&#xff0c;资深数据分析师李晨&#xff08;化名&#xff09;正忙于分析新产品的市场表现。面对传统自助式BI工具&#xff0c;李晨在功能界面中手动设置各种查询条件&#xff0c;进行了一番复杂的拖拉拽操作&#…

spring模块(六)spring监听器(3)广播与异步问题

发布事件和监听器之间默认是同步的&#xff1b;监听器则是广播形式。demo&#xff1a; event&#xff1a; package com.listener.demo.event;import com.listener.demo.dto.UserLogDTO; import org.springframework.context.ApplicationEvent;public class MyLogEvent extends…

界面控件DevExpress中文教程:如何PDF图形对象的可见性?

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress 近期重要版本v24.1已正式发布&#xff0c;该版本拥有众多新产…

数据资产盘点

数据资产盘点包含调研诊断、数据盘点、数据对标校正、分类分级、权责划分、数据资产目录建立六大环节。调研诊断&#xff1a;通常采用访谈或案头梳理的方式&#xff0c;对 IT 整体建设情况、业务系统数据情况进行调研&#xff0c;框定数据资产管理范围、聚焦目标。 数据盘点&a…

spring整合mabatis框架(druid连接池)

spring整合mabatis框架&#xff0c;duird连接池&#xff0c;Junit5测试框架 1&#xff09;创建Maven工程 2&#xff09;导入相关的依赖 <!--springContext依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-contex…

helm一键化部署pod

目录 概念 安装helm helm的命令 自定义模版 回滚 概念 helm提供了一个模版&#xff0c;可以一键化的部署微服务。它通过打包的方式&#xff0c;把所有需要的yaml文件集合一起&#xff0c;然后一键部署&#xff0c;还可以支持回滚。 helm的本质&#xff1a;就是可以把k8s…

低压电抗器与电容器安装距离

低压电抗器与电容器的安装距离是一个关键问题&#xff0c;主要考虑电气安全、热效应以及电磁干扰等因素。通常建议保持适当的安装距离以确保设备的正常运行和安全性。 以下是一些常见的参考原则&#xff1a; 1、热效应 电抗器和电容器在运行过程中都会产生热量。如果两者之间距…

代数模型(Algebraic Models)---线性规划------ + 案例 + Python源码求解(见文中)

目录 一、代数模型&#xff08;Algebraic Models&#xff09;详解1.1什么是代数模型&#xff1f;1.2代数模型的基本形式1.3 安装所需要的Python包--运行下述案例1.4代数模型的应用案例案例 1&#xff1a;市场供需平衡模型Python求解代码Python求解结果如下图&#xff1a; 案例 …

GDPU MySQL数据库 天码行空1 数据库的创建和基本操作

一、实验目的 1&#xff0e;熟知机房用机安全规则。 2&#xff0e;通过上机操作&#xff0c;加深对数据库系统理论知识的理解&#xff1b;通过使用具体的DBMS&#xff0c;了解一种实际的数据库管理系统&#xff0c;并掌握其操作技术&#xff1b;通过对实际题目的上机实验&…

Java8的函数式编程简介

文章目录 环境背景方法方法1&#xff1a;Java 7&#xff08;传统方法&#xff09;方法2&#xff1a;Java 7 &#xff08;策略模式&#xff09;方法3&#xff1a;Java 8的Lambda表达式方法4&#xff1a;Java 8内建的函数式接口Predicate方法5&#xff1a;Java 8的方法引用方法6&…

JavaSE:5、类与对象

1、类的定义与对象的创建 定义属性 创建对象 2、对象的使用 使用一个变量来指代某个对象&#xff0c;只不过引用类型的变量&#xff0c;存储的是对象的引用&#xff0c;而不是对象本身 public class Main {public static void main(String [] argv){Person p1new Person();P…