一文講解如何從 Clickhouse 遷移數據至 DolphinDB

ClickHouse?是 Yandex 公司于2016年開源的 OLAP 列式數據庫管理系統,主要用于 WEB 流量分析。憑借面向列式存儲、支持數據壓縮、完備的 DBMS 功能、多核心并行處理的特點,ClickHouse 被廣泛應用于廣告流量、移動分析、網站分析等領域。

DolphinDB?是一款國產高性能分布式時序數據庫,擁有圖靈完備性的編程語言 DolphinDB Script 和高性能低延時的流計算框架,為海量結構化數據的快速存儲、檢索、分析及計算提供一站式解決方案,適用于量化金融及工業物聯網等領域。自發布以來,DolphinDB 憑借卓越的性能、低維護成本、操作簡單、可擴展性高等優勢,吸引了大量的國內外用戶。

本教程旨在為 ClickHouse 使用者提供一份遷移數據至 DolphinDB 的簡明參考。

1. DolphinDB vs ClickHouse

1.1 DolphinDB 與 ClickHouse 的相同點

  • 分布式存儲和分析:DolphinDB 和 ClickHouse 都設計為支持大規模數據的分布式存儲和分析。它們可以處理海量數據,并提供快速的查詢和分析能力。
  • 列式存儲:兩者都采用了列式存儲結構,更適合海量大數據場景中的寫入和讀取。這種存儲方式在分析型數據庫中通常能夠提供更高的性能,特別是對于聚合和分析查詢。
  • 支持分布式計算:兩者都支持分布式計算,可以橫向擴展以處理大規模數據集。
  • 支持復雜的數據類型:兩者都支持處理復雜的數據類型,包括數組、嵌套結構等,使其適用于各種數據分析場景。

1.2 DolphiDB 與 ClickHouse 的區別

  • 分布式能力:DolphinDB 分布式更強,支持事務和冪等性導數,查詢自動路由,全面元數據管理。
  • 腳本語言:兩者都支持 SQL 查詢,ClickHouse 僅支持 SQL 語言,而 DolphinDB 開發了圖靈完備的腳本語言,具備更強的數據處理能力。
  • 存儲引擎:DolphinDB 自研的 TSDB 存儲引擎將分區內的多列數據 (以 blocks 為存儲形式,block 是 DolphinDB 中最小的存儲單位) 順序存為一個文件,解決了數據分析中寬表查詢和點查詢性能上的痛點。
  • 壓縮算法:DolphinDB 當前僅支持 LZ4、Delta 和枚舉類型的壓縮,而 ClickHouse 不僅支持 LZ4、ZSTD等通用壓縮算法,還針對不同的數據類型開發了不同的編碼方法,如 Delta、Gorilla、T64 等。
  • 生態支持:ClickHouse 是一個開源項目,擁有活躍的開源社區,與各種第三方工具能很好的兼容整合,生態支持完善。而 DolphinDB 是企業級方案,在金融行業和物聯網領域有更多的實際業務積累,有專業的技術支持團隊,可以及時響應、解決客戶在使用 DolphinDB 中遇到的各類問題。

1.3 為什么選擇 DolphinDB?

  • 運維成本:ClickHouse 在設計之初沒有考慮集群版本,所以現在方案都是改良版。ClickHouse 的 shard 及replica 配置、擴縮容異常繁瑣,運維成本高。相比而言,DolphinDB 設計并引入了 DFS 這一抽象文件系統,使得 shard,replica,負載均衡,Failover 均交由 DFS 來實現,用戶無需關心,基本沒有運維成本。
  • 數據一致性:ClickHouse 副本一致性通過 ZooKeeper 同步分布式日志(Replicated Log)來實現最終一致性,即同步期間副本的數據是不一致的。而 DolphinDB 通過兩階段提交協議來保證副本一致性,副本之間是強一致性。
  • 開發成本:DolphinDB 提供了豐富的計算函數支持,并內置了流數據處理框架,僅需投入少量研發資源即可實現復雜業務場景。

2. 應用需求

對于有將數據由 ClickHouse 遷移到 DolphinDB 需求的客戶而言,其常規遷移方案通常基于 CSV 文件的導入導出實現。具體步驟是先將數據從 ClickHouse 中以 CSV 格式導出,再使用 DolphinDB 導入 CSV 文件,從而實現數據的遷移需求。但是這一方案有以下幾點不足之處:

  • 數據量較大時,需要較大的磁盤空間存儲 CSV 文件
  • 實現增量同步困難
  • 數據遷移效率低

DolphinDB 提供了多種靈活的數據同步方法,來幫助用戶方便地把海量數據從多個數據源進行全量同步或增量同步。本文的實踐案例基于這一需求,根據 2021.01.04 一天的逐筆成交數據,數據量約 2721 萬,提供將數據從 ClickHouse 遷移到 DolphinDB 的高性能解決方案。

3. 實現方法

由 ClickHouse 遷移到 DolphinDB 的方案主要有:ODBC 插件、DataX、CSV 文件導入、HTTP Client + zmq 插件等。本文選擇使用 ODBC 插件、DataX 進行數據遷移,主要基于以下幾點原因:

  • 二者實現簡單、數據流轉鏈路短,遷移效率更高
  • 無需額外空間存儲中間文件
  • 增量同步方案實現簡單

本文數據遷移的具體實現框架如下:

  • ODBC 插件

ODBC(Open Database Connectivity) 插件是 DolphinDB 提供的通過 ODBC 接口訪問 Oracle 的開源產品。使用插件配合 DolphinDB 腳本使用,與服務器在同一個進程空間內運行,能高效地完成 Oracle 數據到 DolphinDB 的數據寫入。

ODBC 提供如下函數,函數的具體使用請參考?ODBC 插件。

  1. odbc::connect(connStr, [dataBaseType])
  2. odbc::close(conn)
  3. odbc::query(connHandle or connStr, querySql, [t], [batchSize], [tranform])
  4. odbc::execute(connHandle or connStr, SQLstatements)
  5. odbc::append(connHandle, tableData, tablename, [createTableIfNotExist], [insertIgnore])
  • DataX 驅動

DataX 是可擴展的數據同步框架,將不同數據源的同步抽象為從源頭數據源讀取數據的 Reader 插件,以及向目標端寫入數據的 Writer 插件,理論上 DataX 框架可以支持任意數據源類型的數據同步工作。

DolphinDB 提供基于 DataXReader 和 DataXWriter 的開源驅動。DolphinDBWriter 插件實現了向 DolphinDB 寫入數據,使用 DataX 的現有 reader 插件結合 DolphinDBWriter 插件,即可實現從不同數據源向 DolphinDB 同步數據。用戶可以在 Java 項目中包含 DataX 的驅動包,開發從 ClickHouse 數據源到 DolphinDB 的數據遷移軟件。


4. 遷移案例與操作步驟

4.1 環境配置

本次案例中使用了以下數據庫及插件,各版本型號如下:

ClickHouse 版本:23.8.2.7

unixODBC?版本:2.3.7

DolphinDB Server?版本:2.00.10.1

DolphinDB GUI?版本:1.30.21.4

2.00.10.1 版本 Server 自帶 ODBC 插件,位于 Server 的?<HomeDir>/plugins?目錄,可直接加載使用。如果?<HomeDir>/plugins?目錄下不存在 ODBC 文件夾,則通過如下鏈接下載:

DolphinDBPlugin?分支:release200.10

請注意,DolphinDB ODBC 插件版本號必須與 Server 版本號一致,否則可能出現報錯。例如,DolphinDB Server 版本號為 2.00.10.X,則必須使用 release200.10 分支的 ODBC 插件。

如果想自行編譯,請參考:?ODBC 插件?文章中的第2章。

4.2 建庫建表

針對上面的測試數據,我們需要在 DolphinDB 里創建對應的庫表,用于存儲遷移過來的數據。對于實際的數據,需要綜合考慮被遷移數據的字段、類型、數據量,在 DolphinDB 是否需要分區,分區方案,使用 OLAP還是 TSDB 引擎等情況,去設計建庫建表方案。一些數據存儲庫表設計實踐,可以參考?DolphinDB 數據庫分區教程

本例建表文件 createTable.dos 內容如下:

create database "dfs://TSDB_tick" partitioned by VALUE([2023.02.01,2023.02.02]),HASH([SYMBOL,10]),engine=`TSDB
create table 'dfs://TSDB_tick'.'tick'(SecurityID SYMBOL,TradeTime TIMESTAMP [compress='delta'],TradePrice DOUBLE,TradeQty INT,TradeAmount DOUBLE,BuyNo INT,SellNo INT,ChannelNo INT,TradeIndex INT,TradeBSFlag SYMBOL,BizIndex INT
)
partitioned by TradeTime,SecurityID,
sortColumns=`SecurityID`TradeTime

從 ClickHouse 遷移到 DolphinDB 的數據字段映射關系如下表:

ClickHouse 字段含義ClickHouse 字段ClickHouse 數據類型DolphinDB 字段含義DolphinDB 字段DolphinDB 數據類型
證券代碼SecurityIDString證券代碼SecurityIDSYMBOL
交易時間TradeTimeDateTime64交易時間TradeTimeTIMESTAMP
交易價格TradePriceDOUBLE交易價格TradePriceDOUBLE
交易數量TradeQtyInt32交易數量TradeQtyINT
交易金額TradeAmountDOUBLE交易金額TradeAmountDOUBLE
買方委托索引BuyNoInt32買方委托索引BuyNoINT
賣方委托索引SellNoInt32賣方委托索引SellNoINT
成交編號TradeIndexInt32成交編號TradeIndexINT
頻道代碼ChannelNoInt32頻道代碼ChannelNoINT
成交方向TradeBSFlagString成交方向TradeBSFlagSYMBOL
業務序列號BizIndexInt64業務序列號BizIndexINT

其部分數據示例如下:

SecurityIDTradeTimeTradePriceTradeQtyTradeAmountBuyNoSellNoTradeIndexChannelNoTradeBSFlagBizIndex
6000202021.01.04T09:25:00.6303.3921007,119.8596178316197191N123713
6000202021.01.04T09:25:00.6303.3910003,390.12994578316197201N123714
6000202021.01.04T09:25:00.6303.399003,051.15803978316197211N123715

4.3 通過 ODBC 插件遷移

本例中部署 DolphinDB 的服務器操作系統為 Centos。

4.3.1 安裝 unixODBC 庫

Centos 系統:

# 安裝 unixODBC 庫
yum install unixODBC unixODBC-devel

如果是 Ubuntu 系統,使用以下命令安裝:

# 安裝 unixODBC 庫
apt-get install unixodbc unixodbc-dev
4.3.2 下載 ClickHouse 的 ODBC 驅動并安裝

第一步,下載?clickhouse-odbc?并解壓至自定義目錄中,假設安裝目錄為 <savedir>。

mkdir <savedir>
cd <savedir>
wget https://github.com/ClickHouse/clickhouse-odbc/releases/download/v1.2.1.20220905/clickhouse-odbc-linux.zip
unzip clickhouse-odbc-linux.zip

第二步,在?/etc/odbcinst.ini?文件中,添加以下內容:

注意:需要替換 <savedir> 為實際的安裝目錄。

[ODBC Drivers] 
ClickHouse ODBC Driver (ANSI)    = Installed 
ClickHouse ODBC Driver (Unicode) = Installed [ClickHouse ODBC Driver (ANSI)] 
Description = ODBC Driver (ANSI) for ClickHouse 
Driver      = <savedir>/clickhouse-odbc-1.2.1-Linux/lib64/libclickhouseodbc.so 
Setup       = <savedir>/clickhouse-odbc-1.2.1-Linux/lib64/libclickhouseodbc.so 
UsageCount  = 1 [ClickHouse ODBC Driver (Unicode)] 
Description = ODBC Driver (Unicode) for ClickHouse 
Driver      =<savedir>/clickhouse-odbc-1.2.1-Linux/lib64/libclickhouseodbcw.so 
Setup       =<savedir>/clickhouse-odbc-1.2.1-Linux/lib64/libclickhouseodbcw.so 
UsageCount  = 1 

第三步,在?/etc/odbc.ini?文件中,添加以下內容:

注意:若不存在該文件可自行創建。

[ODBC Data Sources] 
ClickHouse DSN (ANSI)=ClickHouse ODBC Driver (ANSI) 
ClickHouse DSN (Unicode)=ClickHouse ODBC Driver (Unicode) [ClickHouseAnsi] 
Driver=ClickHouse ODBC Driver (ANSI) 
Description=DSN (localhost) for ClickHouse ODBC Driver (ANSI) 
Server = localhost
Database = default
UID = default
PWD = 123456
Port = 8123
Proto = http[ClickHouseUni] 
Driver=ClickHouse ODBC Driver (Unicode) 
Description=DSN (localhost) for ClickHouse ODBC Driver (Unicode) 
Server = localhost
Database = default
UID = default
PWD = 123456
Port = 8123
Proto = http
4.3.3 同步數據
  1. 運行以下命令加載 ODBC 插件(?ServerPath?請自行修改)
loadPlugin("ServerPath/plugins/odbc/PluginODBC.txt")

2. 運行以下命令建立與 ClickHouse 的連接( Dsn 的名稱請自行修改)

conn = odbc::connect("Dsn=ClickHouseAnsi", `ClickHouse)

3. 運行以下命令開始同步數據

def syncData(conn, dbName, tbName, dt){sql = "select SecurityID, TradeTime, TradePrice, TradeQty, TradeAmount, BuyNo, SellNo, ChannelNo, TradeIndex, TradeBSFlag, BizIndex from migrate.ticksh"if(!isNull(dt)) {sql = sql + " WHERE toDate(TradeTime) = '"+temporalFormat(dt,'yyyy-MM-dd')+"'"}odbc::query(conn,sql, loadTable(dbName,tbName), 100000)
}
dbName="dfs://TSDB_tick"
tbName="tick"
syncData(conn, dbName, tbName, NULL)

數據共 27211975 條,同步數據耗時約158秒。

4. 同步增量數據

def scheduleLoad(conn,dbName,tbName){sqlQuery = "select SecurityID, TradeTime, TradePrice, TradeQty, TradeAmount, BuyNo, SellNo, ChannelNo, TradeIndex, TradeBSFlag, BizIndex from migrate.ticksh"sql = sqlQuery + " WHERE toDate(TradeTime) = '"+temporalFormat(today()-1,'yyyy-MM-dd')+"'"odbc::query(conn,sql, loadTable(dbName,tbName), 100000)
}
scheduleJob(jobId=`test, jobDesc="test",jobFunc=scheduleLoad{conn,dbName,tbName},scheduleTime=00:05m,startDate=2023.11.03, endDate=2024.11.03, frequency='D')

4.4 通過 DataX 遷移

4.4.1 部署DataX

從?DataX 下載地址?下載 DataX 壓縮包后,解壓至自定義目錄。

注意:2023年9月后發布的 datax 中才有 clickhousereader 插件, 如已安裝老版本 datax,則只需下載安裝包中的 clickhousereader 復制到?DataX/plugin/reader?目錄下,即可使用。

4.4.2 部署 DataX-DolphinDBWriter 插件

將?DataX-DolphinDBWriter?中源碼的?./dist/dolphindbwriter?目錄下所有內容拷貝到?DataX/plugin/writer?目錄下,即可使用。

4.4.3 執行 DataX 任務
  1. 配置 json 文件

配置文件?ClickHouseToDDB.json?的具體內容如下,并將 json 文件置于自定義目錄下,本教程中方放置于?datax-writer-master/ddb_script/?目錄下。

{"job": {"content": [{"writer": {"parameter": {"dbPath": "dfs://TSDB_tick","userId": "admin","tableName": "tick","host": "127.0.0.1","pwd": "123456","table": [{"type": "DT_SYMBOL","name": "SecurityID"},{"type": "DT_TIMESTAMP","name": "TradeTime"},{"type": "DT_DOUBLE","name": "TradePrice"},{"type": "DT_INT","name": "TradeQty"},{"type": "DT_DOUBLE","name": "TradeAmount"},{"type": "DT_INT","name": "BuyNo"},{"type": "DT_INT","name": "SellNo"},{"type": "DT_INT","name": "TradeIndex"},{"type": "DT_INT","name": "ChannelNo"},{"type": "DT_SYMBOL","name": "TradeBSFlag"},{"type": "DT_INT","name": "BizIndex"}],"port": 10001},"name": "dolphindbwriter"},"reader": {"parameter": {"username": "default","column": ["SecurityID", "toString(TradeTime)", "TradePrice", "TradeQty", "TradeAmount", "BuyNo", "SellNo", "ChannelNo", "TradeIndex", "TradeBSFlag", "BizIndex"],"connection": [{"table": ["ticksh"],"jdbcUrl": ["jdbc:clickhouse://127.0.0.1:8123/migrate"]}],"password": "123456","where": ""},"name": "clickhousereader"}}],"setting": {"speed": {"channel": 1}}}
}

注:當前 clickhousereader 無法識別 DateTime64 類型,故需轉為字符串("toString(TradeTime)")取數。

2. Linux 終端中執行以下命令以執行 DataX 任務

python datax.py ../../datax-writer-master/ddb_script/ClickHouseToDDB.json

3. 查看 DataX 同步結果

任務啟動時刻                    : 2023-11-03 17:11:26
任務結束時刻                    : 2023-11-03 17:14:57
任務總計耗時                    :                210s
任務平均流量                    :            8.93MB/s
記錄寫入速度                    :         129580rec/s
讀出記錄總數                    :            27211975
讀寫失敗總數                    :                   0

4. 同步增量數據

使用 DataX 同步增量數據,可在?ClickHouseToDDB.json?的 ”reader“ 中增加 "where" 條件對數據日期進行篩選,如此每次執行同步任務時至同步 where 條件過濾后的數據,以同步前一天的數據為例,示例如下:

"reader": {"parameter": {"username": "default","column": ["SecurityID", "toString(TradeTime)", "TradePrice", "TradeQty", "TradeAmount", "BuyNo", "SellNo", "ChannelNo", "TradeIndex", "TradeBSFlag", "BizIndex"],"connection": [{"table": ["ticksh"],"jdbcUrl": ["jdbc:clickhouse://127.0.0.1:8123/migrate"]}],"password": "123456","where": "toDate(TradeTime) = date_sub(day,1,today())"},"name": "clickhousereader",
}


5. 基準性能

分別使用 ODBC 插件和 DataX 驅動進行數據遷移, 數據量 2721 萬條,遷移耗時對比如下表所示:

ODBC插件DataX
158s210s

綜上,ODBC 插件與 DataX 均能實現將 Oracle 中數據遷移到 DolphinDB 中,但是各有優缺點:

  • ODBC 使用簡單,適合靈活導入數據,但是運維管理不便。
  • DataX 需要編寫復雜的導入配置,但是其擴展靈活,方便監控,社區支持豐富。

用戶可以根據需要自行選擇合適的導入方式。

附錄

DataX DolphinDB-Writer 配置項

配置項是否必須數據類型默認值描述
hoststringServer Host
portintServer Port
userIdstringDolphinDB 用戶名導入分布式庫時,必須要有權限的用戶才能操作,否則會返回
pwdstringDolphinDB 用戶密碼
dbPathstring需要寫入的目標分布式庫名稱,比如"dfs://MYDB"。
tableNamestring目標數據表名稱
batchSizeint10000000datax每次寫入dolphindb的批次記錄數
table寫入表的字段集合,具體參考后續table項配置詳解
saveFunctionNamestring自定義數據處理函數。若未指定此配置,插件在接收到reader的數據后,會將數據提交到DolphinDB并通過tableInsert函數寫入指定庫表;如果定義此參數,則會用指定函數替換tableInsert函數。
saveFunctionDefstring數據入庫自定義函數。此函數指 用dolphindb 腳本來實現的數據入庫過程。 此函數必須接受三個參數:dfsPath(分布式庫路徑), tbName(數據表名), data(從datax導入的數據,table格式)

table 配置詳解

table 用于配置寫入表的字段集合。內部結構為

 {"name": "columnName", "type": "DT_STRING", "isKeyField":true}

請注意此處列定義的順序,需要與原表提取的列順序完全一致。

  • name :字段名稱。
  • isKeyField:是否唯一鍵值,可以允許組合唯一鍵。本屬性用于數據更新場景,用于確認更新數據的主鍵,若無更新數據的場景,無需設置。
  • type 枚舉值以及對應 DolphinDB 數據類型如下
DolphinDB 類型配置值
DOUBLEDT_DOUBLE
FLOATDT_FLOAT
BOOLDT_BOOL
DATEDT_DATE
MONTHDT_MONTH
DATETIMEDT_DATETIME
TIMEDT_TIME
SECONDDT_SECOND
TIMESTAMPDT_TIMESTAMP
NANOTIMEDT_NANOTIME
NANOTIMETAMPDT_NANOTIMETAMP
INTDT_INT
LONGDT_LONG
UUIDDT_UUID
SHORTDT_SHORT
STRINGDT_STRING
SYMBOLDT_SYMBOL

完整代碼及測試數據

ClickHouseToDDB.zip?附件中包含以下腳本及測試數據:

  • DataX:?ClickHouseToDDB.json
  • DolphinDB:?createTable.dosClickHouseToDDB_ODBC.dos
  • 模擬數據:gendata.dos

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

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

相關文章

【Hadoop_02】Hadoop運行模式

1、Hadoop的scp與rsync命令&#xff08;1&#xff09;本地運行模式&#xff08;2&#xff09;完全分布式搭建【1】利用102將102的文件推到103【2】利用103將102的文件拉到103【3】利用103將102的文件拉到104 &#xff08;3&#xff09;rsync命令&#xff08;4&#xff09;xsync…

使用 HTML 地標角色提高可訪問性

請務必確保所有用戶都可以訪問您的網站&#xff0c;包括使用屏幕閱讀器等輔助技術的用戶。 一種方法是使用 ARIA 地標角色來幫助屏幕閱讀器用戶輕松瀏覽您的網站。使用地標角色還有其他好處&#xff0c;例如改進 HTML 的語義并更輕松地設置網站樣式。在這篇博文中&#xff0c;我…

深度探索Linux操作系統 —— 構建initramfs

系列文章目錄 深度探索Linux操作系統 —— 編譯過程分析 深度探索Linux操作系統 —— 構建工具鏈 深度探索Linux操作系統 —— 構建內核 深度探索Linux操作系統 —— 構建initramfs 文章目錄 系列文章目錄前言一、為什么需要 initramfs二、initramfs原理探討三、構建基本的init…

tomcat篇---第二篇

系列文章目錄 文章目錄 系列文章目錄前言一、tomcat容器是如何創建servlet類實例?用到了什么原理?二、tomcat 如何優化?三、熟悉tomcat的哪些配置?前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站,這篇文章男女…

Web應用JSON數據保護(密碼算法、密鑰、數字簽名和數據加密)

1.JSON&#xff08;JavaScript Object Notation&#xff09; JSON是一種輕量級的數據交換格式&#xff0c;采用完全獨立于編程語言的文本格式來存儲和表示數據。JSON通過簡單的key-value鍵值對來描述數據&#xff0c;可以被廣泛用于網絡通信、數據存儲等各種應用場景&#xff0…

【重點】Flink四大基石

1. Time&#xff08;時間機制&#xff09; 時間概念 處理時間&#xff1a;執行具體操作時的機器時間&#xff08;例如 Java的 System.currentTimeMillis()) &#xff09;事件時間&#xff1a;數據本身攜帶的時間&#xff0c;事件產生時的時間。攝入時間&#xff1a;數據進入 …

代碼隨想錄算法訓練營第四十六天 _ 動態規劃_198.打家劫舍、213.打家劫舍II、337.打家劫舍 III。

學習目標&#xff1a; 動態規劃五部曲&#xff1a; ① 確定dp[i]的含義 ② 求遞推公式 ③ dp數組如何初始化 ④ 確定遍歷順序 ⑤ 打印遞歸數組 ---- 調試 引用自代碼隨想錄&#xff01; 60天訓練營打卡計劃&#xff01; 學習內容&#xff1a; 198.打家劫舍 動態規劃五步曲&a…

Python面向對象基礎

Python面向對象基礎 一、概念1.1面向對象的設計思想1.2 面向過程和面向對象1.2.1 面向過程1.2.2 面向對象1.2.3 面向過程和面向對象的優缺點 二、類和對象2.1 概念2.2 類的定義2.3 對象的創建2.3.1 類中未定義構造函數2.3.2 類中定義構造函數 2.4 類的設計 三、類中的成員3.1 變…

vue文件下載

第一種方法 const downloadfile (url) > {if (!url) {return ElMessage.error("暫無文件&#xff01;無法下載")}axios({url,method: GET,responseType: blob// headers: {// token:getCache(TOKEN), // 可以攜帶token// }}).then(res > {const href …

go-zero 開發入門-API服務開發示例

接口定義 定義 API 接口文件 接口文件 add.api 的內容如下&#xff1a; syntax "v1"info (title: "API 接口文件示例"desc: "演示如何編寫 API 接口文件"author: "一見"date: "2023年12月07日"version: "…

Python教程-數組

作為軟件開發者&#xff0c;我們總是努力編寫干凈、簡潔、高效的代碼。在本文中&#xff0c;我們將探索 Python 數組的各種特性和功能。我們將學習如何在 Python 中創建、操作和使用數組&#xff0c;以及數組與 Python 編程語言中的其他數據結構有何不同。我們的目標是提供有關…

找重復的數據(一維數組)

在一大堆數據中找出重復的是一件經常要做的事情。現在&#xff0c;我們要處理許多整數&#xff0c;在這些整數中&#xff0c;可能存在重復的數據。 你要寫一個程序來做這件事情&#xff0c;讀入數據&#xff0c;檢查是否有重復的數據。如果有&#xff0c;輸出“YES”這三個字母…

資源文件、布局管理器、樣式表拓展

QT 資源文件 提供了和本地路徑無關的資源管理。 圖片資源的獲取&#xff1a;阿里巴巴矢量圖庫&#xff08;&#x1f448; 安全鏈接&#xff0c;放心跳轉&#xff09; widget.ui .qrc widget.h #ifndef WIDGET_H #define WIDGET_H#include <QtWidgets>namespace Ui { c…

Plonky2 = Plonk + FRI

Plonky2由Polygon Zero團隊開發&#xff0c;實現了一種快速的遞歸SNARK&#xff0c;據其團隊公開的基準測試&#xff0c;2020年&#xff0c;以太坊第一筆遞歸證明需要60s生成&#xff0c;而于今Plonky2在 MacBook Pro上生成只需 170 毫秒。 下面將逐步剖析Plonky2。 整體構造 …

活久見—當設置不同坐標系統時,ArcMap中的圖形相關位置關系會變化

這兩天一件十分神奇的事情發生了&#xff1a;當設置不同坐標系統時&#xff0c;ArcMap中的圖形相對位置關系會變化。 事情起因是這樣的&#xff1a;博主和同行用ArcMap同時驗證2個相鄰多邊形的相對位置關系&#xff0c;見下圖圖1和圖2的多邊形&#xff0c;在博主的ArcMap中&am…

大電流H橋電機驅動電路的設計與解析(包括自舉電路的講解,以IR2104+LR7843為例)

大電流H橋電機驅動電路的設計與解析&#xff08;包括自舉電路的講解&#xff0c;以IR2104LR7843為例&#xff09; 電機驅動板主要采用兩種驅動芯片&#xff0c;一種是全橋驅動&#xff08;如&#xff1a;HIP4082&#xff09;&#xff0c;一種是半橋驅動&#xff08;如&#xff…

單片機語言--C51語言的數據類型以及存儲類型以及一些基本運算

C51語言 本文主要涉及C51語言的一些基本知識&#xff0c;比如C51語言的數據類型以及存儲類型以及一些基本運算。 文章目錄 C51語言一、 C51與標準C的比較二、 C51語言中的數據類型與存儲類型2.1、C51的擴展數據類型2.2、數據存儲類型 三、 C51的基本運算3.1 算術運算符3.2 邏輯…

奇數位字符反轉算法

題目描述&#xff1a; 題目描述 編寫函數void oddReverse(char *s),將所有奇數位的字符反轉。輸入格式 輸入一個字符串 s保證輸入字符串 s 的長度大于等于1小于等于100輸出格式 輸出修改后的字符串 s。輸入樣例1 012345輸出樣例1 052341輸入樣例2 01234輸出樣例2 03214輸入樣例…

Pycharm Jupyter ModuleNotFoundError 問題解決

Pycharm Jupyter ModuleNotFoundError 問題解決 0. 問題描述1. 解決方法 0. 問題描述 通過 Pycharm 啟動的 Jypyter&#xff0c;發生 ModuleNotFoundError 的問題。 實際上相關 Module 已經通過 pip install 安裝完成&#xff0c;所以懷疑是 Jupyter 的問題。 1. 解決方法 …

什么是HTML以及超鏈接,特殊符號轉義的簡單使用

目錄 什么是HTML&#x1f338; HTML版本 版本說明&#x1f338; XHTML和HTML的區別 超鏈接&#x1f338;基本語法&#x1f338;鏈接的分類 特殊符號 什么是HTML HTML 不是編程語言&#xff0c;沒有邏輯處理能力&#xff0c;沒有計算能力&#xff0c;不能動態地生成內容&#x…