在Linux上使用DuckCP實現從csv文件匯總數據到SQLite數據庫的表

從pypi網站Duckcp頁面下載duckcp-0.1.1-py3-none-any.whl
一開始用的Python 3.11.2環境。
繼續沿用上文打補丁的方法,得到一個支持python3.11.1的安裝包。
因為缺少zip壓縮工具,使用python程序來完成對修改后文件的重新壓縮。

import os
import zipfile
from pathlib import Pathdef zip_directory_contents(source_dir, output_zip):"""壓縮目錄下的所有內容到ZIP文件(不包括根目錄本身):param source_dir: 要壓縮的目錄路徑:param output_zip: 輸出的ZIP文件路徑"""source_path = Path(source_dir).resolve()with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zipf:for root, dirs, files in os.walk(source_dir):# 計算相對于源目錄的路徑rel_path = os.path.relpath(root, start=source_path)for file in files:file_path = Path(root) / file# 在ZIP中存儲的相對路徑(去掉最外層的a/)arcname = os.path.join(rel_path, file)zipf.write(file_path, arcname=arcname)# 確保空目錄也被包含if not files and not dirs:# 添加空目錄(必須以/結尾)rel_dir = os.path.relpath(root, start=source_path) + '/'zipf.writestr(rel_dir, '')zip_directory_contents('/par/whl/', '/par/whloutput_zip')

將得到的zip文件重命名為原始文件名,然后安裝

mv /par/whloutput_zip /par/duckcp-0.1.1-py3-none-any.whlpython3 pip.pyz install  /par/duckcp-0.1.1-py3-none-any.whl --break-system-packages -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

安裝過程沒有報錯。
1.創建配置元數據庫

duckcp meta create
Traceback (most recent call last):File "/usr/local/bin/duckcp", line 5, in <module>from duckcp import mainFile "/usr/local/lib/python3.11/dist-packages/duckcp/__init__.py", line 5, in <module>from duckcp.boot import app, meta_command, repository_command, storage_command, transformer_command, task_commandFile "/usr/local/lib/python3.11/dist-packages/duckcp/boot/__init__.py", line 5, in <module>from duckcp.configuration.meta_configuration import enable_metadata_configurationFile "/usr/local/lib/python3.11/dist-packages/duckcp/configuration/meta_configuration.py", line 9, in <module>from duckcp.entity.executor import ExecutorFile "/usr/local/lib/python3.11/dist-packages/duckcp/entity/executor.py", line 69def records[T: tuple[Any, ...]](self, sql: str, *parameters: Any, constructor: RecordConstructorProtocol[T] = None) -> list[T]:^
SyntaxError: expected '('

創建元數據庫報錯,應該就是不支持python3.11版本。改用Python 3.13.1,這一步順利完成。需要說明,這些步驟都是由于我的環境和軟件要求的Python版本不同引起的,如果版本正確, 這些問題都不會發生。

duckcp meta create2025-07-28 07:02:08.448 INFO duckcp.service.meta_service#meta_create : 配置文件(/root/.config/com.yinfn.duckcp/configuration.db)初始化                                      ]8;id=117526;file:///usr/local/lib/python3.13/site-packages/duckcp/service/meta_service.pymeta_service.py]8;;:]8;id=511219;file:///usr/local/lib/python3.13/site-packages/duckcp/service/meta_service.py#2020]8;;
2025-07-28 07:02:08.452 INFO duckcp.service.meta_service#meta_create : 執行腳本(001-repositories.sql)                                                                       ]8;id=289077;file:///usr/local/lib/python3.13/site-packages/duckcp/service/meta_service.pymeta_service.py]8;;:]8;id=303663;file:///usr/local/lib/python3.13/site-packages/duckcp/service/meta_service.py#2424]8;;

命令輸出的信息有點多,向軟件作者張澤鵬先生請教,他說可以用-q選項減少輸出。但我們首次使用時,信息多更有利于排查問題。
2.創建源和目標存儲庫
因為我要實現從csv文件匯總數據,所以要在配置元數據庫中登記csv文件存儲位置。
通過以下命令完成

duckcp repository create 文件倉庫 -k file --folder data

作為數據源的csv文件,直接復制自duckcp例子,因為復制出來的字符分隔符是tab字符,所以改名為progs.tsv

id	name	language
1	Joe	Java
2	Alice	JavaScript
3	Leon	C/C++
4	William	Java
5	James	C/C++
6	Enson	C/C++

對于目標,我一開始用的命令是,

duckcp repository create sqlite -k sqlite  --folder data --file sqlite.db

以為這樣就能把data目錄下的sqlite.db數據庫作為目標,其實不然,打開配置元數據庫檢查,里面的內容如下。

./sqlite3 $HOME/.config/com.yinfn.duckcp/configuration.db
sqlite> .tables
credentials         snapshots           tasks               transformers      
repositories        storages            tasks_transformerssqlite> .header on
sqlite> select * from repositories;
id|kind|code|properties|created_at|updated_at
1|file|文件倉庫|{"folder":"/par/data"}|2025-07-28 07:18:32|2025-07-28 07:18:32
2|sqlite|sqlite|{"file":"/par/sqlite.db","folder":"/par/data"}|2025-07-28 07:20:25|2025-07-28 07:20:25

sqlite所在行的properties列顯示不符合預期。
張澤鵬先生說,數據庫無需使用–folder參數,只要在–file中寫明完整路徑即可。所以正確命令如下:

duckcp repository create sqlite2 -k sqlite --file data/sqlite.db

因為duckcp本質上是一個ETL工具,它不會幫我們建庫,所以要事先手工用sqlite軟件實際創建data目錄下的sqlite.db數據庫,并建立保存目標數據的表。

./sqlite3 data/sqlite.db
sqlite> create table prog_sum(language varchar,cnt int);
sqlite> .exit

3.創建存儲單元
存儲單元這個名字的含義是數據庫里的表的別名,我一開始漏掉了這一步,執行后面的命令就出錯了main : 目標倉庫(sqlite2)的存儲單元(prog_sum)不存在

duckcp storage create prog_sum -r sqlite2 --table prog_sum

4.創建數據遷移任務
第一步是建立一個sql腳本,它負責讀取源表(本例是Csv文件)執行匯總。
我直接照搬duckcp例子中的腳本,改了文件名。保存為data/trans.sql

select"language" as "編程語言",count(*) as "程序員人數"
fromread_csv('progs.tsv')
group by"language"
order by"程序員人數" desc

然后執行命令

duckcp transformer create 數據統計 -s 文件倉庫 -t sqlite2 -o prog_sum -f data/trans.sql

5.執行數據遷移任務

duckcp transformer execute 數據統計
2025-07-28 08:28:36.086 INFO duckcp.transform.database_transform#database_transform : 清空表(DELETE FROM "prog_sum")                                                  ]8;id=758441;file:///usr/local/lib/python3.13/site-packages/duckcp/transform/database_transform.pydatabase_transform.py]8;;:]8;id=170976;file:///usr/local/lib/python3.13/site-packages/duckcp/transform/database_transform.py#3030]8;;
2025-07-28 08:28:36.221 INFO duckcp.transform.database_transform#database_transform : 批量添加數據(INSERT INTO "prog_sum" ("編程語言", "程序員人數") VALUES (?, ?))   ]8;id=941332;file:///usr/local/lib/python3.13/site-packages/duckcp/transform/database_transform.pydatabase_transform.py]8;;:]8;id=508716;file:///usr/local/lib/python3.13/site-packages/duckcp/transform/database_transform.py#3535]8;;
2025-07-28 08:28:36.224 ERROR duckcp#main : table prog_sum has no column named 編程語言  

又報錯了,但這是最后一個錯誤,提示信息也很明確,只要把目標表的列名改成和上述sql一模一樣的列名就行了。

./sqlite3 data/sqlite.db
sqlite> alter table prog_sum rename language to "編程語言";
sqlite> alter table prog_sum rename cnt to "程序員人數";
sqlite> .exit

再次執行任務,當看到transformer_execute : 從倉庫(文件倉庫)遷移數據到倉庫(sqlite2)的存儲單元(prog_sum) 信息就表明數據遷移成功,此時可以用sqlite打開目標表,結果符合預期。

sqlite> select * from prog_sum;
C/C++|3
Java|2
JavaScript|1

下面驗證源文件更新后,數據重新匯總的結果被轉移到目標表。

./duckdb131
DuckDB v1.3.1 (Ossivalis) 2063dda3e6
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.D select * from 'data/progs.tsv';
┌───────┬─────────┬────────────┐
│  id   │  name   │  language  │
│ int64 │ varcharvarchar   │
├───────┼─────────┼────────────┤
│     1 │ Joe     │ Java       │
│     2 │ Alice   │ JavaScript │
│     3 │ Leon    │ C/C++      │
│     4 │ William │ Java       │
│     5 │ James   │ C/C++      │
│     6 │ Enson   │ C/C++      │
└───────┴─────────┴────────────┘
D copy( from 'data/progs.tsv' union all select 7,'zhang3','sql') to 'data/progs.tsv'; 
D select * from 'data/progs.tsv';
┌───────┬─────────┬────────────┐
│  id   │  name   │  language  │
│ int64 │ varcharvarchar   │
├───────┼─────────┼────────────┤
│     1 │ Joe     │ Java       │
│     2 │ Alice   │ JavaScript │
│     3 │ Leon    │ C/C++      │
│     4 │ William │ Java       │
│     5 │ James   │ C/C++      │
│     6 │ Enson   │ C/C++      │
│     7 │ zhang3  │ sql        │
└───────┴─────────┴────────────┘
D .exit
root@217449ea9d61:/par# duckcp transformer execute 數據統計
2025-07-28 08:51:51.005 INFO duckcp.transform.database_transform#database_transform : 清空表(DELETE FROM "prog_sum")                                                  ]8;id=353910;file:///usr/local/lib/python3.13/site-packages/duckcp/transform/database_transform.pydatabase_transform.py]8;;:]8;id=259843;file:///usr/local/lib/python3.13/site-packages/duckcp/transform/database_transform.py#3030]8;;
2025-07-28 08:51:51.123 INFO duckcp.transform.database_transform#database_transform : 批量添加數據(INSERT INTO "prog_sum" ("編程語言", "程序員人數") VALUES (?, ?))   ]8;id=595510;file:///usr/local/lib/python3.13/site-packages/duckcp/transform/database_transform.pydatabase_transform.py]8;;:]8;id=232644;file:///usr/local/lib/python3.13/site-packages/duckcp/transform/database_transform.py#3535]8;;
2025-07-28 08:51:51.323 INFO duckcp.service.transformer_service#transformer_execute : 從倉庫(文件倉庫)遷移數據到倉庫(sqlite2)的存儲單元(prog_sum)                   ]8;id=489086;file:///usr/local/lib/python3.13/site-packages/duckcp/service/transformer_service.pytransformer_service.py]8;;:]8;id=370598;file:///usr/local/lib/python3.13/site-packages/duckcp/service/transformer_service.py#273273]8;;
root@217449ea9d61:/par# ./sqlite3 data/sqlite.db
SQLite version 3.42.0 2023-05-16 12:36:15
Enter ".help" for usage hints.
sqlite> .header on
sqlite> select * from prog_sum;
編程語言|程序員人數
C/C++|3
Java|2
sql|1
JavaScript|1

可見,結果多出了sql|1這行,它就是數據源插入zhang3的結果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90873.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90873.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于深度學習的圖像分類:使用EfficientNet實現高效分類

前言 圖像分類是計算機視覺領域中的一個基礎任務&#xff0c;其目標是將輸入的圖像分配到預定義的類別中。近年來&#xff0c;深度學習技術&#xff0c;尤其是卷積神經網絡&#xff08;CNN&#xff09;&#xff0c;在圖像分類任務中取得了顯著的進展。EfficientNet是一種新型的…

Java基礎-綜合案例

1、設計一個可以執行基本數學運算&#xff08;加減乘除&#xff09;的計算器程序功能描述&#xff1a;用戶輸入兩個數字、一個運算符&#xff08;、-、*、/&#xff09;。根據所選運算符執行相應的數學運算&#xff0c;顯示運算結果。import java.util.Scanner;public class Te…

四、計算機組成原理——第3章:存儲系統

目錄 3.1存儲器概述 3.1.1存儲器的分類 1.按在計算機中的作用(層次)分類 2.按存儲介質分類 3.按存取方式分類 4.按信息的可保存性分類 3.1.2存儲器的性能指標 3.2主存儲器 3.2.1SRAM芯片和DRAM芯片 1.SRAM的工作原理 2.DRAM的工作原理 3.SRAM和DRAM的比較 4.存儲器芯片的內部結…

3D Semantic Occupancy Prediction

3D 語義占用預測&#xff08;3D Semantic Occupancy Prediction&#xff09;旨在將真實世界環境劃分為規則的三維體素&#xff08;voxel&#xff09;網格&#xff0c;并對每個體素同時預測&#xff1a; 占用狀態&#xff08;Occupancy&#xff09;&#xff1a;該體素是否被物體…

在Word和WPS文字中添加的拼音放到文字右邊

在Word和WPS文字中&#xff0c;可以方便地為中文漢字添加拼音。默認的是拼音在漢字的上方&#xff0c;而且不方便直接編輯。可以簡單操作后把拼音放在漢字的右邊&#xff0c;并且可以方便地編輯。一、Word&#xff1a;先為漢字添加拼音&#xff0c;然后選擇性粘貼為純文本即可1…

Torchv Unstrustured 文檔解析庫

一個強大且開發者友好的文檔解析庫&#xff0c;專為RAG&#xff08;檢索增強生成&#xff09;應用優化。基于Apache Tika、Apache POI和PDFBox等業界標準Java庫構建&#xff0c;TorchV Unstructured提供了增強的解析能力&#xff0c;具備智能表格結構識別和內容提取功能。 &am…

30天入門Python(基礎篇)——第22天:面向對象之繼承與多繼承

目錄 專欄導讀 學習目標 1. 繼承的基本概念 1.1 繼承的優勢 2. 單繼承 2.1 基本語法 2.2 實際示例 3. super()函數詳解 3.1 基本用法 3.2 super()的高級用法 4. 多繼承 4.1 多繼承語法 4.2 多繼承示例 5. 方法解析順序(MRO) 5.1 查看MRO 5.2 復雜的MRO示例 6. 實際應用案例 6…

學習人工智能所需知識體系及路徑詳解

一、核心基礎知識體系1. 數學基礎線性代數關鍵概念&#xff1a;向量空間、矩陣運算&#xff08;轉置/逆矩陣&#xff09;、特征值分解、奇異值分解&#xff08;SVD&#xff09;應用場景&#xff1a;數據降維&#xff08;PCA&#xff09;、圖像處理&#xff08;矩陣變換&#xf…

前端實現銀河粒子流動特效的技術原理與實踐

文章目錄 1,引言 2,特效效果簡介 3,技術原理解析 1. 粒子系統基礎 2. 銀河結構的數學建模 3. 動態流動與旋轉 4,實現流程圖 5,關鍵代碼實現與詳細講解 1. 初始化Three.js場景 2. 生成銀河粒子數據 3. 創建粒子幾何體與材質 4. 實現粒子的動態旋轉與動畫 5. 可選:粒子顏色…

Qt_Gif_Creator 基于Qt的屏幕gif錄制工具

本文介紹了一個基于Qt框架的屏幕GIF錄制工具的實現。該工具包含XYGifCreator類負責GIF創建邏輯&#xff0c;使用Gif.h庫進行GIF編碼&#xff1b;XYGifFrame類提供GUI界面&#xff0c;支持設置錄制區域大小、幀率以及保存位置。工具采用多線程處理GIF編碼&#xff0c;支持Window…

Linux實戰:HAProxy全方位指南

一、負載均衡核心概念 1.1 負載均衡定義 負載均衡&#xff08;Load Balance&#xff0c;簡稱LB&#xff09;是一種基于硬件設備或軟件服務的高可用反向代理技術。它將特定業務&#xff08;如Web服務、網絡流量&#xff09;分發到后端的一個或多個服務器/設備&#xff0c;從而提…

22 BTLO 藍隊靶場 Countdown 解題記錄

Tools: - ELK - CyberChef - OSINT (whole World Wide Web) Hunt #1: Brute Force DetectedSource: winevent-security (1/3) — 可疑暴力破解流量來自哪個IP地址 What is the IP address from which the suspicious brute force traffic is seen?? 我們需要尋找暴力破解…

文心一言4.5開源模型實戰:ERNIE-4.5-0.3B輕量化部署與效能突破

文心一言4.5開源模型實戰&#xff1a;ERNIE-4.5-0.3B輕量化部署與效能突破 文心一言4.5開源模型實戰&#xff1a;ERNIE-4.5-0.3B輕量化部署與效能突破&#xff0c;本文介紹百度文心一言 4.5 開源模型中 ERNIE-4.5-0.3B 的輕量化部署與效能。該 3 億參數模型破解大模型落地的算力…

SAP-MM-采購訂單批量創建 excel 版

采購訂單批量創建程序摘要:不含任何定制字段的導入,直接導入系統即可使用 該SAP ABAP程序實現采購訂單的批量創建功能,主要特性包括: 支持通過Excel文件批量導入采購訂單數據(XLS/XLSX格式) 提供數據校驗功能,包括: 物料號有效性檢查 采購憑證存在性驗證 科目分配類別…

2_軟件重構_一種組件化開發方式

一、碎碎念 首先先考慮下&#xff0c;什么情況下軟件需要重構&#xff1f;我覺得答案有很多種&#xff0c;而且還有范圍。當日益增長的需求與現有軟件結構越來越無法匹配時——①具體表現可能為新增需求所導致的bug越來越多&#xff0c;一個新功能的改動牽一發而動全身&a…

今日行情明日機會——20250728

上證指數量能持續在200天均量線上&#xff0c;最近今天橫盤震蕩&#xff0c;今天依然收在5天均線上方&#xff0c;個股漲跌個數基本相同。目前依然強勢&#xff0c;有望沖擊3674的前高。需要注意板塊的高低切換。深證指數今天縮量收小陽線&#xff0c;均線多頭的趨勢明顯&#…

【iOS】類和分類的加載過程

目錄 前言 _objc_init方法 environ_init tis->init方法 static_init方法 &#x1f4a1; _objc_init 是由 libc 調用的&#xff0c;目的是&#xff1a; ??“必須自己實現” 是什么意思&#xff1f; runtime_init exception_init cache_t::init _imp_implementati…

大模型算法面試筆記——常用優化器SGD,Momentum,Adagrad,RMSProp,Adam

常用參數&#xff1a;ttt-步數&#xff0c;α\alphaα-學習率&#xff0c;θ\thetaθ-參數&#xff0c;f(θ)f(\theta)f(θ)-目標函數&#xff0c;gtg_tgt?-梯度&#xff0c;β1\beta_1β1?-一階矩衰減系數&#xff0c;通常取0.9&#xff0c;β2\beta_2β2?-二階矩&#xff…

【計算機畢業設計】基于SSM的小型超市管理系統+LW

博主介紹&#xff1a;?全網粉絲3W,csdn特邀作者、CSDN新星計劃導師、Java領域優質創作者,掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和學生畢業項目實戰,高校老師/講師/同行前輩交流? 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、…

火線、零線、地線

我們可以用 “水流” 來比喻 “電流”&#xff0c;這樣理解起來會很簡單&#xff1a;想象一下你家的電路就像一個 “閉合的水循環系統”&#xff1a;&#x1f525; 1. 火線 (Live Wire) - 好比 “進水管的高壓端”作用&#xff1a; 從發電廠或變壓器輸送 高壓電 到你家的插座或…