主頁 > 資料庫 > Doris(五) -- 資料的匯入匯出

Doris(五) -- 資料的匯入匯出

2023-05-31 09:47:57 資料庫

資料匯入

使用 Insert 方式同步資料

用戶可以通過 MySQL 協議,使用 INSERT 陳述句進行資料匯入
INSERT 陳述句的使用方式和 MySQL 等資料庫中 INSERT 陳述句的使用方式類似, INSERT 陳述句支持以下兩種語法:

INSERT INTO table SELECT ...
INSERT INTO table VALUES(...)

對于 Doris 來說,一個 INSERT 命令就是一個完整的匯入事務,

因此不論是匯入一條資料,還是多條資料,我們都不建議在生產環境使用這種方式進行資料匯入,高頻次的 INSERT 操作會導致在存盤層產生大量的小檔案,會嚴重影響系統性能,

該方式僅用于線下簡單測驗或低頻少量的操作,
或者可以使用以下方式進行批量的插入操作:

INSERT INTO example_tbl VALUES
(1000, "baidu1", 3.25)
(2000, "baidu2", 4.25)
(3000, "baidu3", 5.25);

Stream Load

用于將本地檔案匯入到doris中,Stream Load 是通過 HTTP 協議與 Doris 進行連接互動的,
該方式中涉及 HOST:PORT 都是對應的HTTP 協議埠,
? BE 的 HTTP 協議埠,默認為 8040,
? FE 的 HTTP 協議埠,默認為 8030,
但須保證客戶端所在機器網路能夠聯通FE, BE 所在機器,

-- 創建表
drop table if exists load_local_file_test;
CREATE TABLE IF NOT EXISTS load_local_file_test
(
    id INT,
    name VARCHAR(50),
    age TINYINT
)
unique key(id)
DISTRIBUTED BY HASH(id) BUCKETS 3;
# 創建檔案
1,zss,28
2,lss,28
3,ww,88

# 匯入資料
## 語法示例
 curl \
 -u user:passwd \  # 賬號密碼
 -H "label:load_local_file_test" \  # 本次任務的唯一標識
 -T 檔案地址 \
 http://主機名:埠號/api/庫名/表名/_stream_load
# user:passwd 為在 Doris 中創建的用戶,初始用戶為 admin / root,密碼初始狀態下為空,
# host:port 為 BE 的 HTTP 協議埠,默認是 8040,可以在 Doris 集群 WEB UI頁面查看,
# label: 可以在 Header 中指定 Label 唯一標識這個匯入任務,


curl \
 -u root:123 \
 -H "label:load_local_file" \
 -H "column_separator:," \
 -T /root/data/loadfile.txt \
http://doitedu01:8040/api/test/load_local_file_test/_stream_load

curl的一些可配置的引數

  1. label: 匯入任務的標簽,相同標簽的資料無法多次匯入,(標簽默認保留30分鐘)
  2. column_separator:用于指定匯入檔案中的列分隔符,默認為\t,
  3. line_delimiter:用于指定匯入檔案中的換行符,默認為\n,
  4. columns:用于指定檔案中的列和table中列的對應關系,默認一一對應
  5. where: 用來過濾匯入檔案中的資料
  6. max_filter_ratio:最大容忍可過濾(資料不規范等原因)的資料比例,默認零容忍,資料不規范不包括通過 where 條件過濾掉的行,
  7. partitions: 用于指定這次匯入所設計的partition,如果用戶能夠確定資料對應的partition,推薦指定該項,不滿足這些磁區的資料將被過濾掉,
  8. timeout: 指定匯入的超時時間,單位秒,默認是 600 秒,可設定范圍為 1 秒 ~ 259200 秒,
  9. timezone: 指定本次匯入所使用的時區,默認為東八區,該引數會影響所有匯入涉及的和時區有關的函式結果,
  10. exec_mem_limit: 匯入記憶體限制,默認為 2GB,單位為位元組,
  11. format: 指定匯入資料格式,默認是csv,支持json格式,
  12. read_json_by_line: 布爾型別,為true表示支持每行讀取一個json物件,默認值為false,
  13. merge_type: 資料的合并型別,一共支持三種型別APPEND、DELETE、MERGE 其中,APPEND是默認值,表示這批資料全部需要追加到現有資料中,DELETE 表示洗掉與這批資料key相同的所有行,MERGE 語意 需要與delete 條件聯合使用,表示滿足delete 條件的資料按照DELETE 語意處理其余的按照APPEND 語意處理, 示例:-H "merge_type: MERGE" -H "delete: flag=1"
  14. delete: 僅在 MERGE下有意義, 表示資料的洗掉條件 function_column.sequence_col: 只適用于UNIQUE_KEYS,相同key列下,保證value列按照source_sequence列進行REPLACE, source_sequence可以是資料源中的列,也可以是表結構中的一列,

建議一個匯入請求的資料量控制在 1 - 2 GB 以內,如果有大量本地檔案,可以分批并發提交,

匯入json資料

# 準備資料
{"id":1,"name":"liuyan","age":18}
{"id":2,"name":"tangyan","age":18}
{"id":3,"name":"jinlian","age":18}
{"id":4,"name":"dalang","age":18}
{"id":5,"name":"qingqing","age":18}

curl \
 -u root: \
 -H "label:load_local_file_json_20221126" \
 -H "columns:id,name,age" \
 -H "max_filter_ratio:0.1" \
 -H "timeout:1000" \
 -H "exec_mem_limit:1G" \
 -H "where:id>1" \
 -H "format:json" \
 -H "read_json_by_line:true" \
 -H "merge_type:delete" \
 -T /root/data/json.txt \
http://doitedu01:8040/api/test/load_local_file_test/_stream_load
  -H "merge_type:append" \
  # 會把id = 3 的這條資料洗掉
  -H "merge_type:MERGE" \
  -H "delete:id=3"

外部存盤資料匯入(hdfs)

適用場景

? 源資料在 Broker 可以訪問的存盤系統中,如 HDFS,
? 資料量在幾十到百 GB 級別,

基本原理

  1. 創建提交匯入的任務
  2. FE生成執行計劃并將執行計劃分發到多個BE節點上(每個BE節點都匯入一部分資料)
  3. BE收到執行計劃后開始執行,從broker上拉取資料到自己的節點上
  4. 所有BE都完成后,FE決定是否匯入成功,回傳結果給客戶端
-- 新建一張表
drop table if exists load_hdfs_file_test1;
CREATE TABLE IF NOT EXISTS load_hdfs_file_test1
(
    id INT,
    name VARCHAR(50),
    age TINYINT
)
unique key(id)
DISTRIBUTED BY HASH(id) BUCKETS 3;
將本地的資料匯入到hdfs上面
hdfs dfs -put ./loadfile.txt  hdfs://linux01:8020/
hdfs dfs -ls  hdfs://linux01:8020/
-- 匯入語法
LOAD LABEL test.label_202204(
[MERGE|APPEND|DELETE]  -- 不寫就是append
DATA INFILE
(
"file_path1"[, file_path2, ...]  -- 描述資料的路徑   這邊可以寫多個 ,以逗號分割
)
[NEGATIVE]               -- 負增長
INTO TABLE `table_name`  -- 匯入的表名字
[PARTITION (p1, p2, ...)] -- 匯入到哪些磁區,不符合這些磁區的就會被過濾掉
[COLUMNS TERMINATED BY "column_separator"]  -- 指定分隔符
[FORMAT AS "file_type"] -- 指定存盤的檔案型別
[(column_list)] -- 指定匯入哪些列 
[COLUMNS FROM PATH AS (c1, c2, ...)]  -- 從路勁中抽取的部分列
[SET (column_mapping)] -- 對于列可以做一些映射,寫一些函式
-- 這個引數要寫在要寫在set的后面
[PRECEDING FILTER predicate]  -- 在mapping前做過濾做一些過濾
[WHERE predicate]  -- 在mapping后做一些過濾  比如id>10 
[DELETE ON expr] --根據欄位去做一些抵消消除的策略  需要配合MERGE
[ORDER BY source_sequence] -- 匯入資料的時候保證資料順序
[PROPERTIES ("key1"="value1", ...)]  -- 一些配置引數
-- 將hdfs上的資料load到表中
LOAD LABEL test.label_20221125
(
DATA INFILE("hdfs://linux01:8020/test.txt")
INTO TABLE `load_hdfs_file_test`
COLUMNS TERMINATED BY ","
(id,name,age)
)
with HDFS (
"fs.defaultFS"="hdfs://linux01:8020",
"hadoop.username"="root"
)
PROPERTIES
(
"timeout"="1200",
"max_filter_ratio"="0.1"
);


-- 這是一個異步的操作,所以需要去查看下執行的狀態
show load order by createtime desc limit 1\G;

從 HDFS 匯入資料,使用通配符匹配兩批兩批檔案,分別匯入到兩個表中

LOAD LABEL example_db.label2
(
    DATA INFILE("hdfs://linux01:8020/input/file-10*")
    INTO TABLE `my_table1`
    PARTITION (p1)
    COLUMNS TERMINATED BY ","
    FORMAT AS "parquet"  
    (id, tmp_salary, tmp_score) 
    SET (
        salary= tmp_salary + 1000,
        score = tmp_score + 10
    ),
    DATA INFILE("hdfs://linux01:8020/input/file-20*")
    INTO TABLE `my_table2`
    COLUMNS TERMINATED BY ","
    (k1, k2, k3)
)
with HDFS (
"fs.defaultFS"="hdfs://linux01:8020",
"hadoop.username"="root"
)


-- 匯入資料,并提取檔案路徑中的磁區欄位
LOAD LABEL example_db.label10
(
    DATA INFILE("hdfs://linux01:8020/user/hive/warehouse/table_name/dt=20221125/*")
    INTO TABLE `my_table`
    FORMAT AS "csv"
    (k1, k2, k3)
    COLUMNS FROM PATH AS (dt)
)
WITH BROKER hdfs
(
    "username"="root",
    "password"="123"
);

-- 對待匯入資料進行過濾,
LOAD LABEL example_db.label6
(
    DATA INFILE("hdfs://linux01:8020/input/file")
    INTO TABLE `my_table`
    (k1, k2, k3)
    SET (
        k2 = k2 + 1
    )
        PRECEDING FILTER k1 = 1  ==》前置過濾
    WHERE k1 > k2   ==》 后置過濾
)
WITH BROKER hdfs
(
    "username"="root",
    "password"="123"
);

-- 只有原始資料中,k1 = 1,并且轉換后,k1 > k2 的行才會被匯入,

取消匯入任務

當 Broker load 作業狀態不為 CANCELLED 或 FINISHED 時,可以被用戶手動取消,
取消時需要指定待取消匯入任務的 Label ,取消匯入命令語法可執行 HELP CANCEL LOAD 查看,

CANCEL LOAD [FROM db_name] WHERE LABEL="load_label"; 

通過外部表同步資料

Doris 可以創建外部表,創建完成后,可以通過 SELECT 陳述句直接查詢外部表的資料,也可以通過 INSERT INTO SELECT 的方式匯入外部表的資料,

Doris 外部表目前支持的資料源包括:MySQL,Oracle,Hive,PostgreSQL,SQLServer,Iceberg,ElasticSearch

-- 整體語法
CREATE [EXTERNAL] TABLE table_name ( 
 col_name col_type [NULL | NOT NULL] [COMMENT "comment"] 
) ENGINE=HIVE
[COMMENT "comment"]
PROPERTIES (
-- 我要映射的hive表在哪個庫里面
-- 映射的表名是哪一張
-- hive的元資料服務地址
 'property_name'='property_value',
 ...
);

-- 引數說明:
-- 1.外表列 
-- 	列名要與 Hive 表一一對應
-- 	列的順序需要與 Hive 表一致
-- 	必須包含 Hive 表中的全部列
-- 	Hive 表磁區列無需指定,與普通列一樣定義即可, 
-- 2.ENGINE 需要指定為 HIVE 
-- 3.PROPERTIES 屬性: 
-- 	hive.metastore.uris:Hive Metastore 服務地址 
-- 	database:掛載 Hive 對應的資料庫名 
-- 	table:掛載 Hive 對應的表名 

完成在 Doris 中建立 Hive 外表后,除了無法使用 Doris 中的資料模型(rollup、預聚合、物化視圖等)外,與普通的 Doris OLAP 表并無區別

-- 在Hive 中創建一個測驗用表:
CREATE TABLE `user_info` ( 
 `id` int, 
 `name` string, 
 `age` int
) stored as orc;

insert into user_info values (1,'zss',18);
insert into user_info values (2,'lss',20);
insert into user_info values (3,'ww',25);

-- Doris 中創建外部表
CREATE EXTERNAL TABLE `hive_user_info` (
 `id` int, 
 `name` varchar(10), 
 `age` int 
) ENGINE=HIVE 
PROPERTIES ( 
'hive.metastore.uris' = 'thrift://linux01:9083', 
'database' = 'db1', 
'table' = 'user_info' 
);

外部表創建好后,就可以直接在doris中對這個外部表進行查詢了
直接查詢外部表,無法利用到doris自身的各種查詢優化機制!

select * from hive_user_info;

-- 將資料從外部表匯入內部表
-- 資料從外部表匯入內部表后,就可以利用doris自身的查詢優勢了!
-- 假設要匯入的目標內部表為: doris_user_info  (需要提前創建)

CREATE TABLE IF NOT EXISTS doris_user_info
(
    id INT,
    name VARCHAR(50),
    age TINYINT
)
unique key(id)
DISTRIBUTED BY HASH(id) BUCKETS 3;

-- 就是用sql查詢,從外部表中select出資料后,insert到內部表即可
insert into doris_user_info
select
 *
from hive_user_info;

注意:
Hive 表 Schema 變更不會自動同步,需要在 Doris 中重建 Hive 外表,
當前 Hive 的存盤格式僅支持 Text,Parquet 和 ORC 型別

Binlog Load

Binlog Load提供了一種使Doris增量同步用戶在Mysql資料庫中對資料更新操作的CDC(Change Data Capture)功能,

基本原理
當前版本設計中,Binlog Load需要依賴canal作為中間媒介,讓canal偽造成一個從節點去獲取Mysql主節點上的Binlog并決議,再由Doris去獲取Canal上決議好的資料,主要涉及Mysql端、Canal端以及Doris端

  1. FE會為每個資料同步作業啟動一個canal client,來向canal server端訂閱并獲取資料,
  2. client中的receiver將負責通過Get命令接收資料,每獲取到一個資料batch,都會由consumer根據對應表分發到不同的channel,每個channel都會為此資料batch產生一個發送資料的子任務Task,
  3. 在FE上,一個Task是channel向BE發送資料的子任務,里面包含分發到當前channel的同一個batch的資料,
  4. channel控制著單個表事務的開始、提交、終止,一個事務周期內,一般會從consumer獲取到多個batch的資料,因此會產生多個向BE發送資料的子任務Task,在提交事務成功前,這些Task不會實際生效,
  5. 滿足一定條件時(比如超過一定時間、達到提交最大資料大小),consumer將會阻塞并通知各個channel提交事務,
  6. 當且僅當所有channel都提交成功,才會通過Ack命令通知canal并繼續獲取并消費資料,
  7. 如果有任意channel提交失敗,將會重新從上一次消費成功的位置獲取資料并再次提交(已提交成功的channel不會再次提交以保證冪等性),
  8. 整個資料同步作業中,FE通過以上流程不斷的從canal獲取資料并提交到BE,來完成資料同步,

Mysql端

在Mysql Cluster模式的主從同步中,二進制日志檔案(Binlog)記錄了主節點上的所有資料變化,資料在Cluster的多個節點間同步、備份都要通過Binlog日志進行,從而提高集群的可用性,架構通常由一個主節點(負責寫)和一個或多個從節點(負責讀)構成,所有在主節點上發生的資料變更將會復制給從節點,
注意:目前必須要使用Mysql 5.7及以上的版本才能支持Binlog Load功能,

# 打開mysql的二進制binlog日志功能,則需要編輯my.cnf組態檔設定一下,
find / -name my.cnf
/etc/my.cnf
# 修改mysqld中的一些組態檔
[mysqld]
server_id = 1
log-bin = mysql-bin
binlog-format = ROW

#binlog-format 的三種模式
#ROW   記錄每一行資料的資訊
#Statement  記錄sql陳述句
#Mixed   上面兩種的混合

# 重啟 MySQL 使配置生效
systemctl restart mysqld 
-- 創建用戶并授權
-- 設定這些引數可以使得mysql的密碼簡單化
set global validate_password_length=4; 
set global validate_password_policy=0; 
-- 新增一個canal的用戶,讓他監聽所有庫中的所有表,并且設定密碼為canal
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'canal' ;
-- 重繪一下權限
FLUSH PRIVILEGES;

-- 準備測驗表
CREATE TABLE `user_doris2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

配置 Canal 端

Canal 是屬于阿里巴巴 otter 專案下的一個子專案,主要用途是基于 MySQL 資料庫增量日志決議,提供增量資料訂閱和消費,用于解決跨機房同步的業務場景,建議使用 canal 1.1.5及以上版本,

下載地址:https://github.com/alibaba/canal/releases

# 上傳并解壓 canal deployer壓縮包
mkdir /opt/apps/canal
tar -zxvf canal.deployer-1.1.5.tar.gz -C /opt/apps/canal

# 在 conf 檔案夾下新建目錄并重命名 
# 一個 canal 服務中可以有多個 instance,conf/下的每一個目錄即是一個實體,每個實體下面都有獨立的組態檔
mkdir /opt/apps/canel/conf/doris

# 拷貝組態檔模板 
cp /opt/apps/canal/conf/example/instance.properties /opt/apps/canal/conf/doris/
# 修改 conf/canal.properties 的配置
vi canal.properties

# 進入找到canal.destinations = example
# 將其修改為 我們自己配置的目錄
canal.destinations = doris
# 修改 instance 組態檔
vi instance.properties 
# 修改:
canal.instance.master.address=doitedu01:3306
# 啟動
sh bin/startup.sh

注意:canal client 和 canal instance 是一一對應的,Binlog Load 已限制多個資料同步作 業不能連接到同一個 destination,

配置目標表

基本語法:
CREATE SYNC [db.]job_name
(
 channel_desc,
 channel_desc
 ...
)
binlog_desc
-- 引數說明:
-- job_name:是資料同步作業在當前資料庫內的唯一標識
-- channel_desc :用來定義任務下的資料通道,可表示 MySQL 源表到 doris 目標表的映射關系,在設定此項時,如果存在多個映射關系,必須滿足 MySQL 源表應該與 doris 目標表是一一對應關系,其他的任何映射關系(如一對多關系),檢查語法時都被視為不合法,
-- column_mapping:主要指MySQL源表和doris目標表的列之間的映射關系,如果不指定,FE 會默認源表和目標表的列按順序一一對應,但是我們依然建議顯式的指定列的映射關系,這樣當目標表的結構發生變化(比如增加一個 nullable 的列),資料同步作業依然可以進行,否則,當發生上述變動后,因為列映射關系不再一一對應,匯入將報錯, 
-- binlog_desc:定義了對接遠端 Binlog 地址的一些必要資訊,目前可支持的對接型別只有 canal 方式,所有的配置項前都需要加上 canal 前綴,
-- 	canal.server.ip: canal server 的地址 
-- 	canal.server.port: canal server 的埠 
-- 	canal.destination: 前文提到的 instance 的字串標識 
-- 	canal.batchSize: 每批從 canal server 處獲取的 batch 大小的最大值,默認 8192 
-- 	canal.username: instance 的用戶名 
-- 	canal.password: instance 的密碼 
-- 	canal.debug: 設定為 true 時,會將 batch 和每一行資料的詳細資訊都列印出來,會影響性能,



-- Doris 創建與 Mysql 對應的目標表
CREATE TABLE `binlog_mysql` ( 
 `id` int(11) NOT NULL COMMENT "", 
 `name` VARCHAR(50) NOT NULL COMMENT "", 
 `age` int(11) NOT NULL COMMENT "" ,
 `gender` VARCHAR(50) NOT NULL COMMENT ""
) ENGINE=OLAP 
UNIQUE KEY(`id`) 
DISTRIBUTED BY HASH(`id`) BUCKETS 1; 


CREATE SYNC test.job20221228
(
 FROM test.binlog_test INTO binlog_test
)
FROM BINLOG 
(
 "type" = "canal",
 "canal.server.ip" = "linux01",
 "canal.server.port" = "11111",
 "canal.destination" = "doris",
 "canal.username" = "canal",
 "canal.password" = "canal"
);

-- 查看作業狀態
-- 展示當前資料庫的所有資料同步作業狀態, 
SHOW SYNC JOB; 
-- 展示資料庫 `test_db` 下的所有資料同步作業狀態, 
SHOW SYNC JOB FROM `test`; 

-- 停止名稱為 `job_name` 的資料同步作業 
STOP SYNC JOB [db.]job_name 

-- 暫停名稱為 `job_name` 的資料同步作業 
PAUSE SYNC JOB [db.]job_name 

-- 恢復名稱為 `job_name` 的資料同步作業 
RESUME SYNC JOB `job_name` 

資料匯出

資料匯出(Export)是 Doris 提供的一種將資料匯出的功能,該功能可以將用戶指定的表或磁區的資料,以文本的格式,通過 Broker 行程匯出到遠端存盤上,如 HDFS / 物件存盤(支持S3協議) 等,
原理

  1. 用戶提交一個 Export 作業到 FE,
  2. FE 的 Export 調度器會通過兩階段來執行一個 Export 作業:
  3. PENDING:FE 生成 ExportPendingTask,向 BE 發送 snapshot 命令,對所有涉及到的 Tablet 做一個快照,并生成多個查詢計劃,
  4. EXPORTING:FE 生成 ExportExportingTask,開始執行查詢計劃,

查詢計劃拆分

Export 作業會生成多個查詢計劃,每個查詢計劃負責掃描一部分 Tablet,每個查詢計劃掃描的 Tablet 個數由 FE 配置引數 export_tablet_num_per_task 指定,默認為 5,即假設一共 100 個 Tablet,則會生成 20 個查詢計劃,用戶也可以在提交作業時,通過作業屬性 tablet_num_per_task 指定這個數值,
一個作業的多個查詢計劃順序執行

查詢計劃執行

一個查詢計劃掃描多個分片,將讀取的資料以行的形式組織,每 1024 行為一個 batch,呼叫 Broker 寫入到遠端存盤上,
查詢計劃遇到錯誤會整體自動重試 3 次,如果一個查詢計劃重試 3 次依然失敗,則整個作業失敗,
Doris 會首先在指定的遠端存盤的路徑中,建立一個名為 __doris_export_tmp_12345 的臨時目錄(其中 12345 為作業 id),匯出的資料首先會寫入這個臨時目錄,每個查詢計劃會生成一個檔案,檔案名示例:

export-data-c69fcf2b6db5420f-a96b94c1ff8bccef-1561453713822

其中 c69fcf2b6db5420f-a96b94c1ff8bccef 為查詢計劃的 query id,1561453713822 為檔案生成的時間戳,當所有資料都匯出后,Doris 會將這些檔案 rename 到用戶指定的路徑中

示例:匯出到hdfs

EXPORT TABLE test.event_info_log1 -- 庫名.表名
to "hdfs://linux01:8020/event_info_log1"  -- 匯出到那里去
PROPERTIES
(
    "label" = "event_info_log1",
    "column_separator"=",",
    "exec_mem_limit"="2147483648",
    "timeout" = "3600"
)
WITH BROKER "broker_name"
(
    "username" = "root",
    "password" = ""
);

-- 1.label:本次匯出作業的標識,后續可以使用這個標識查看作業狀態,
-- 2.column_separator:列分隔符,默認為 \t,支持不可見字符,比如 '\x07',
-- 3.columns:要匯出的列,使用英文狀態逗號隔開,如果不填這個引數默認是匯出表的所有列,
-- 4.line_delimiter:行分隔符,默認為 \n,支持不可見字符,比如 '\x07',
-- 5.exec_mem_limit: 表示 Export 作業中,一個查詢計劃在單個 BE 上的記憶體使用限制,默認 2GB,單位位元組,
-- 6.timeout:作業超時時間,默認 2小時,單位秒,
-- 7.tablet_num_per_task:每個查詢計劃分配的最大分片數,默認為 5,


-- 查看匯出狀態
show EXPORT \G;

注意事項

  1. 不建議一次性匯出大量資料,一個 Export 作業建議的匯出資料量最大在幾十 GB,過大的匯出會導致更多的垃圾檔案和更高的重試成本,
  2. 如果表資料量過大,建議按照磁區匯出,
  3. 在 Export 作業運行程序中,如果 FE 發生重啟或切主,則 Export 作業會失敗,需要用戶重新提交,
  4. 如果 Export 作業運行失敗,在遠端存盤中產生的 __doris_export_tmp_xxx 臨時目錄,以及已經生成的檔案不會被洗掉,需要用戶手動洗掉,
  5. 如果 Export 作業運行成功,在遠端存盤中產生的 __doris_export_tmp_xxx 目錄,根據遠端存盤的檔案系統語意,可能會保留,也可能會被清除,比如在百度物件存盤(BOS)中,通過 rename 操作將一個目錄中的最后一個檔案移走后,該目錄也會被洗掉,如果該目錄沒有被清除,用戶可以手動清除
  6. 當 Export 運行完成后(成功或失敗),FE 發生重啟或切主,則 SHOW EXPORT展示的作業的部分資訊會丟失,無法查看,
  7. Export 作業只會匯出 Base 表的資料,不會匯出 Rollup Index 的資料,
  8. Export 作業會掃描資料,占用 IO 資源,可能會影響系統的查詢延遲

查詢結果匯出

SELECT INTO OUTFILE 陳述句可以將查詢結果匯出到檔案中,目前支持通過 Broker行程, 通過 S3 協議, 或直接通過 HDFS 協議,匯出到遠端存盤,如 HDFS,S3,BOS,COS (騰訊云)上,

-- 語法
query_stmt  -- 查詢陳述句
INTO OUTFILE "file_path"  --匯出檔案的路勁
[format_as]  -- 指定檔案存盤的格式
[properties]  -- 一些組態檔

file_path:指向檔案存盤的路徑以及檔案前綴,如 hdfs://path/to/my_file_.最終的檔案名將由 my_file_,檔案序號以及檔案格式后綴組成,其中檔案序號由 0 開始,數量為檔案被分割的數量

-- 如
my_file_abcdefg_0.csv 
my_file_abcdefg_1.csv 
my_file_abcdegf_2.csv 

-- [format_as]:指定匯出格式,默認為 CSV
-- [properties]:指定相關屬性,目前支持通過 Broker 行程,hdfs協議等
-- Broker 相關屬性需加前綴 broker.
-- HDFS 相關屬性需加前綴 hdfs. 其中hdfs.fs.defaultFS 用于填寫 namenode地址和埠,屬于必填項,
-- 如:
("broker.prop_key" = "broker.prop_val", ...)
("hdfs.fs.defaultFS" = "xxx", "hdfs.hdfs_user" = "xxx")

-- 其他屬性:
-- column_separator:列分隔符,僅對 CSV 格式適用,默認為 \t, 
-- line_delimiter:行分隔符,僅對 CSV 格式適用,默認為 \n, 
-- max_file_size:單個檔案的最大大小,默認為 1GB,取值范圍在 5MB 到 2GB 之間,超過這個大小的檔案將會被切分,
-- schema:PARQUET 檔案 schema 資訊,僅對 PARQUET 格式適用,匯出檔案格式為 PARQUET 時,必須指定 schema,

使用 broker 方式,將簡單查詢結果匯出

select * from log_detail where id >2
INTO OUTFILE "hdfs://doitedu01:8020/doris-out/broker_a_" 
FORMAT AS CSV 
PROPERTIES 
( 
"broker.name" = "broker_name", 
"column_separator" = ",", 
"line_delimiter" = "\n", 
"max_file_size" = "100MB" 
); 

使用 HDFS 方式匯出

EXPLAIN SELECT * FROM log_detail
INTO OUTFILE "hdfs://doris-out/hdfs_" 
FORMAT AS CSV 
PROPERTIES 
( 
"fs.defaultFS" = "hdfs://doitedu01:8020", 
"hadoop.username" = "root",
"column_separator" = ","
);

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/553892.html

標籤:大數據

上一篇:4萬多論壇頭像個性頭像ACCESS資料庫

下一篇:返回列表

標籤雲
其他(160048) Python(38189) JavaScript(25466) Java(18161) C(15234) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7217) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5344) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4579) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1977) 功能(1967) Web開發(1951) HtmlCss(1950) C++(1927) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1862) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • Doris(五) -- 資料的匯入匯出

    # 資料匯入 ## 使用 Insert 方式同步資料 用戶可以通過 MySQL 協議,使用 INSERT 陳述句進行資料匯入 INSERT 陳述句的使用方式和 MySQL 等資料庫中 INSERT 陳述句的使用方式類似。 INSERT 陳述句支持以下兩種語法: ```SQL INSERT INTO tabl ......

    uj5u.com 2023-05-31 09:47:57 more
  • 4萬多論壇頭像個性頭像ACCESS資料庫

    在之前就弄到過個性網名和論壇簽名的資料,比如有《8萬多個網名大全QQ網名ACCESS資料庫》、《個性網名大全網路名稱大全ACCESS資料庫》《2萬多條QQ簽名論壇簽名大全ACCESS資料庫》、《24萬QQ傷感簽名論壇簽名ACCESS資料庫》、《近2萬簽名的句子網路簽名ACCESS資料庫》、《上萬條個 ......

    uj5u.com 2023-05-31 09:47:38 more
  • 用一杯星巴克的錢,訓練自己私有化的ChatGPT

    ![file](https://img2023.cnblogs.com/other/2685289/202305/2685289-20230530115137903-2141604303.png) > 文章摘要:用一杯星巴克的錢,自己動手2小時的時間,就可以擁有自己訓練的開源大模型,并可以根據不同的 ......

    uj5u.com 2023-05-31 09:45:27 more
  • Doris(三) -- Rollup和物化視圖

    # Rollup ROLLUP 在多維分析中是“上卷”的意思,即將資料按某種指定的粒度進行進一步聚合。 通過建表陳述句創建出來的表稱為 Base 表(Base Table,基表) 在 Base 表之上,我們可以創建任意多個 ROLLUP 表。這些 ROLLUP 的資料是基于 Base 表產生的,并且在 ......

    uj5u.com 2023-05-30 08:18:20 more
  • 花了億點點時間,寫了一個趕海和茶藝小程式:探索多重功能,開啟精彩互

    在繁忙的生活中,我們常常渴望找到一個靈感迸發、充滿藝術與智慧的休憩之所。幸運的是,經過小編沒日沒夜的奮斗,趕海和茶藝小程式應運而生,為您帶來一系列令人驚喜的功能,讓您盡情享受多重體驗。 趕海和茶藝小程式融合了多種功能,帶給您全方位的娛樂、學習和創作體驗。無論是積累功德、獲取每日推送的精彩內容,還是發 ......

    uj5u.com 2023-05-30 08:18:00 more
  • GaussDB(DWS)遷移實踐丨row_number輸出結果不一致

    摘要:遷移前后結果集row_number欄位值前后不一致,前在DWS上運行不一致。 本文分享自華為云社區《GaussDB(DWS)遷移 - oracle兼容 --row_number輸出結果不一致》,作者:譡里個檔 。 【問題表現】 遷移前后結果集row_number欄位值前后不一致,前在DWS上運 ......

    uj5u.com 2023-05-30 08:17:39 more
  • 玩轉MySQL資料庫之SQL優化之慢查詢

    本系列為:MySQL資料庫詳解,為千鋒資深教學老師獨家創作,致力于為大家講解清晰MySQL資料庫相關知識點,含有豐富的代碼案例及講解。如果感覺對大家有幫助的話,可以【關注】持續追更~文末有本文重點總結,技術類問題,也歡迎大家和我們溝通交流! ......

    uj5u.com 2023-05-30 08:17:34 more
  • 上萬條全球各國紙幣大全含圖ACCESS資料庫

    《上萬條全球各國紙幣大全含圖ACCESS資料庫》是今天采集自錢幣大全網站的紙幣資料,大類包含:中國大陸、中國臺灣、中國香港、中國澳門、亞洲紙鈔、歐洲紙鈔、美洲紙鈔、非洲紙鈔 、大洋洲、其他紙鈔等,而且紙幣資訊包含:國家名稱、英文名稱、目錄編號、紙鈔面額、紙鈔年版、紙鈔規格、所屬類別、詳細資訊等。 收 ......

    uj5u.com 2023-05-30 08:11:56 more
  • GaussDB(DWS)遷移實踐丨row_number輸出結果不一致

    摘要:遷移前后結果集row_number欄位值前后不一致,前在DWS上運行不一致。 本文分享自華為云社區《GaussDB(DWS)遷移 - oracle兼容 --row_number輸出結果不一致》,作者:譡里個檔 。 【問題表現】 遷移前后結果集row_number欄位值前后不一致,前在DWS上運 ......

    uj5u.com 2023-05-30 08:00:44 more
  • 花了億點點時間,寫了一個趕海和茶藝小程式:探索多重功能,開啟精彩互

    在繁忙的生活中,我們常常渴望找到一個靈感迸發、充滿藝術與智慧的休憩之所。幸運的是,經過小編沒日沒夜的奮斗,趕海和茶藝小程式應運而生,為您帶來一系列令人驚喜的功能,讓您盡情享受多重體驗。 趕海和茶藝小程式融合了多種功能,帶給您全方位的娛樂、學習和創作體驗。無論是積累功德、獲取每日推送的精彩內容,還是發 ......

    uj5u.com 2023-05-30 08:00:06 more