日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Insert

本文為您介紹如何使用INSERT語句向StarRocks中導入數據。

適用場景

  • 如果僅導入幾條測試數據,則可以使用INSERT INTO VALUES語句。

  • 如果將源表中的數據進行ETL轉換并導入到一個新的StarRocks表中,則可以使用INSERT INTO SELECT語句。

  • 如果僅覆蓋寫入幾條測試數據,則可以使用INSERT OVERWRITE VALUES語句。

  • 如果將源表中的數據進行ETL轉換并覆蓋寫入到一個新的StarRocks表中,則可以使用INSERT OVERWRITE SELECT語句。

說明

源表可以是一張或多張內部表或者外部表。目標表必須是StarRocks的內表。

注意事項

  • StarRocks在執行INSERT語句時,如果有數據不符合目標表格式(例如字符串超長等情況),INSERT操作默認執行失敗。您可以通過設置會話變量enable_insert_strictfalse以確保INSERT操作過濾不符合目標表格式的數據,并繼續執行。

  • 頻繁使用INSERT語句導入小批量數據會產生過多的數據版本,從而影響查詢性能,因此不建議您頻繁使用INSERT語句導入數據或將其作為生產環境的日常例行導入任務。如果您的業務場景需要流式導入或者小批量多次導入數據,建議使用Stream Load或者Routine Load的方式進行導入。

  • 執行INSERT OVERWRITE語句后,系統將為目標分區創建相應的臨時分區,并將數據寫入臨時分區,最后使用臨時分區原子替換目標分區來實現覆蓋寫入。其所有過程均在Leader FE節點執行。因此,如果Leader FE節點在覆蓋寫入過程中發生宕機,將會導致該次INSERT OVERWRITE導入失敗,其過程中所創建的臨時分區也會被刪除。

基本語法

INSERT { INTO | OVERWRITE } [db_name.]<table_name>
[ PARTITION (<partition_name> [, ...] ) ]
[ TEMPORARY PARTITION (<temporary_partition_name> [, ...] ) ]
[ WITH LABEL <label>]
[ (<column_name>[, ...]) ]
{ VALUES ( { <expression> | DEFAULT } [, ...] ) | <query> }

參數說明如下表所示。

參數

說明

INTO

將數據追加寫入目標表。

OVERWRITE

將數據覆蓋寫入目標表。

table_name

導入數據的目標表名稱。填寫形式為db_name.table_name。

PARTITION

導入的目標分區。必須是目標表中存在的分區,多個分區名稱用逗號(,)分隔。如果指定該參數,數據只會被導入相應分區內。如果未指定,則默認將數據導入至目標表的所有分區。

TEMPORARY PARTITION

指定數據導入的臨時分區。詳情請參見臨時分區

label

導入任務的標識,在數據庫內唯一。建議您指定Label。

  • 如果未指定,StarRocks會自動為任務生成一個Label,當導入任務因網絡錯誤未返回結果時,您將無法確認該導入操作是否成功。

  • 如果指定Label,您可以通過SQL命令SHOW LOAD WHERE label="label";查看任務結果。

column_name

導入的目標列,必須是目標表中存在的列。該參數的對應關系與列名無關,但與其順序一一對應。如果不指定目標列,默認為目標表中的所有列。如果源表中的某個列在目標列不存在,則寫入默認值。如果當前列沒有默認值,導入任務會失敗。如果查詢語句的結果列類型與目標列的類型不一致,會進行隱式轉化,如果不能進行轉化,那么INSERT INTO語句會報語法解析錯誤。

VALUES

通過VALUES語句插入一條或者多條數據。

重要

VALUES方式僅適用于導入幾條數據作為Demo的情況,完全不適用于任何測試和生產環境。StarRocks系統本身也不適合單條數據導入的場景。建議使用INSERT INTO SELECT的方式進行批量導入。

expression

表達式,用以為對應列賦值。

DEFAULT

為對應列賦予默認值。

query

查詢語句,查詢的結果會導入至目標表中。支持StarRocks提供的所有SQL查詢語法。

相關配置

您可以為INSERT導入任務設定以下配置項。

FE配置項

FE配置項

說明

insert_load_default_timeout_second

INSERT導入任務的超時時間,單位為秒。如果當前INSERT導入任務在該參數設定的時間內未完成則會被系統取消,狀態為CANCELLED。目前僅支持通過該參數為所有INSERT導入任務統一設定超時時間,不支持為單獨的導入任務設置超時時間。默認為3600秒(1小時)。如果導入任務無法在規定時間內完成,您可以通過調整該參數延長超時時間。

Session變量

Session變量

說明

enable_insert_strict

INSERT導入是否容忍錯誤數據行。

  • true(默認值):表示如果有一條數據錯誤,則返回導入失敗。

  • false:表示如果至少有一條數據被正確導入,則返回導入成功,并會返回一個Label。

    可通過SET enable_insert_strict = false來設置。

query_timeout

SQL命令的超時時間,單位為秒。INSERT語句作為SQL命令,同樣受到該Session變量的限制。您可以通過SET query_timeout = xxx;命令來設定該參數。

準備工作

查看權限

導入操作需要目標表的INSERT權限。如果您的用戶賬號沒有INSERT權限,請參考GRANT給用戶賦權,語法為GRANT INSERT ON TABLE <table_name> IN DATABASE <database_name> TO { ROLE <role_name> | USER <user_identity>}

建庫建表

在StarRocks中創建數據庫load_test,并在其中創建導入目標表insert_wiki_edit以及數據源表source_wiki_edit。

說明

本文中演示的操作示例均基于目標表insert_wiki_edit和數據源表source_wiki_edit。如果您選擇使用自己的表以及數據,請跳過當前步驟,并根據使用場景修改需要導入的數據。

CREATE DATABASE IF NOT EXISTS load_test;
USE load_test;
CREATE TABLE insert_wiki_edit
(
    event_time      DATETIME,
    channel         VARCHAR(32)      DEFAULT '',
    user            VARCHAR(128)     DEFAULT '',
    is_anonymous    TINYINT          DEFAULT '0',
    is_minor        TINYINT          DEFAULT '0',
    is_new          TINYINT          DEFAULT '0',
    is_robot        TINYINT          DEFAULT '0',
    is_unpatrolled  TINYINT          DEFAULT '0',
    delta           INT              DEFAULT '0',
    added           INT              DEFAULT '0',
    deleted         INT              DEFAULT '0'
)
DUPLICATE KEY(
    event_time,
    channel,
    user,
    is_anonymous,
    is_minor,
    is_new,
    is_robot,
    is_unpatrolled
)
PARTITION BY RANGE(event_time)(
    PARTITION p06 VALUES LESS THAN ('2015-09-12 06:00:00'),
    PARTITION p12 VALUES LESS THAN ('2015-09-12 12:00:00'),
    PARTITION p18 VALUES LESS THAN ('2015-09-12 18:00:00'),
    PARTITION p24 VALUES LESS THAN ('2015-09-13 00:00:00')
)
DISTRIBUTED BY HASH(user);

CREATE TABLE source_wiki_edit
(
    event_time      DATETIME,
    channel         VARCHAR(32)      DEFAULT '',
    user            VARCHAR(128)     DEFAULT '',
    is_anonymous    TINYINT          DEFAULT '0',
    is_minor        TINYINT          DEFAULT '0',
    is_new          TINYINT          DEFAULT '0',
    is_robot        TINYINT          DEFAULT '0',
    is_unpatrolled  TINYINT          DEFAULT '0',
    delta           INT              DEFAULT '0',
    added           INT              DEFAULT '0',
    deleted         INT              DEFAULT '0'
)
DUPLICATE KEY(
    event_time,
    channel,user,
    is_anonymous,
    is_minor,
    is_new,
    is_robot,
    is_unpatrolled
)
PARTITION BY RANGE(event_time)(
    PARTITION p06 VALUES LESS THAN ('2015-09-12 06:00:00'),
    PARTITION p12 VALUES LESS THAN ('2015-09-12 12:00:00'),
    PARTITION p18 VALUES LESS THAN ('2015-09-12 18:00:00'),
    PARTITION p24 VALUES LESS THAN ('2015-09-13 00:00:00')
)
DISTRIBUTED BY HASH(user);

通過INSERT INTO VALUES導入

您可以通過INSERT INTO VALUES語句向指定的表中直接導入數據。此導入方式中,多條數據用逗號(,)分隔。詳細使用方式,請參見INSERTINSERT

說明

INSERT INTO VALUES語句導入方式僅適用于導入少量數據作為驗證DEMO用途,不適用于大規模測試或生產環境。如需大規模導入數據,請選擇其他導入方式。

以下示例以insert_load_wikipedia為Label向數據源表source_wiki_edit中導入兩條數據。

INSERT INTO load_test.source_wiki_edit
WITH LABEL insert_load_wikipedia
VALUES
    ("2015-09-12 00:00:00","#en.wikipedia","AustinFF",0,0,0,0,0,21,5,0),
    ("2015-09-12 00:00:00","#ca.wikipedia","helloSR",0,1,0,1,0,3,23,0);

參數

說明

table_name

導入數據的目標表。使用db_name.table_name形式。

label

導入任務的標識,在數據庫內唯一。如果未指定,StarRocks會自動為任務生成一個Label。建議您指定Label。否則,如果當前導入任務因網絡錯誤無法返回結果,您將無法得知該導入操作是否成功。如果指定了Label,可以通過SQL命令SHOW LOAD WHERE label="label";查看任務結果。

values

通過VALUES語法插入一條或者多條數據,多條數據用逗號(,)分隔。

通過INSERT INTO SELECT導入

您可以通過INSERT INTO SELECT語句將源表中的數據進行ETL轉換之后,導入到StarRocks內表中。源表可以是一張或多張內部表或者外部表。目標表必須是StarRocks的內表。執行該語句之后,系統將SELECT語句結果導入目標表。

說明

以下示例僅展示導入內部表數據,其操作過程與導入外部表數據相同,故不重復演示導入外部表數據過程。

  • 以下示例以insert_load_wikipedia_1為Label將源表中的數據導入至目標表中。

    INSERT INTO load_test.insert_wiki_edit
    WITH LABEL insert_load_wikipedia_1
    SELECT * FROM load_test.source_wiki_edit;
  • 以下示例以insert_load_wikipedia_2為Label將源表中的數據導入至目標表的p06p12分區中。如果不指定目標分區,數據將會導入全表;如果指定目標分區,數據只會導入指定的分區。

    INSERT INTO load_test.insert_wiki_edit PARTITION(p06, p12)
    WITH LABEL insert_load_wikipedia_2
    SELECT * FROM load_test.source_wiki_edit;

    如果清空p06p12分區,則查詢不到先前插入至對應分區的數據。

    TRUNCATE TABLE load_test.insert_wiki_edit PARTITION(p06, p12);
    SELECT * FROM load_test.insert_wiki_edit;
  • 以下示例以insert_load_wikipedia_3為Label將源表中event_timechannel列的數據導入至目標表的對應列中。未被導入的列將被賦予默認值。

    INSERT INTO load_test.insert_wiki_edit
    WITH LABEL insert_load_wikipedia_3 
    (
        event_time, 
        channel
    )
    SELECT event_time, channel FROM load_test.source_wiki_edit;

通過INSERT OVERWRITE VALUES覆蓋寫入

您可以通過INSERT OVERWRITE VALUES語句向指定的表中覆蓋寫入數據。此導入方式中,多條數據用逗號(,)分隔。詳細使用方式,請參見INSERTINSERT。

說明

INSERT OVERWRITE VALUES語句導入方式僅適用于導入少量數據作為驗證DEMO用途,不適用于大規模測試或生產環境。如需大規模導入數據,請選擇其他導入方式。

查詢源表,確認其中已有數據。

SELECT * FROM load_test.source_wiki_edit;

系統返回如下查詢結果。

image

以下示例以insert_load_wikipedia_ow為Label向源表source_wiki_edit中覆蓋寫入兩條數據。

INSERT OVERWRITE load_test.source_wiki_edit
WITH LABEL insert_load_wikipedia_ow
VALUES
    ("2015-09-12 00:00:00","#cn.wikipedia","GELongstreet",0,0,0,0,0,36,36,0),
    ("2015-09-12 00:00:00","#fr.wikipedia","PereBot",0,1,0,1,0,17,17,0);

查詢源表,系統返回如下查詢結果,表明數據已經成功覆蓋。

image

通過INSERT OVERWRITE SELECT覆蓋寫入

您可以通過INSERT OVERWRITE SELECT語句將源表中的數據覆蓋寫入至目標表中。INSERT OVERWRITE SELECT將源表中的數據進行ETL轉換之后,覆蓋寫入到StarRocks內表中。源表可以是一張或多張內部表或者外部表。目標表必須是StarRocks的內表。執行該語句之后,系統使用SELECT語句結果覆蓋目標表的數據。詳細使用方式,請參見INSERTINSERT

說明

以下示例僅展示導入內部表數據,其操作過程與導入外部表數據相同,故不重復演示導入外部表數據過程。

  • 以下示例以insert_load_wikipedia_ow_1為Label將源表中的數據覆蓋寫入至目標表中。

    INSERT OVERWRITE load_test.insert_wiki_edit
    WITH LABEL insert_load_wikipedia_ow_1
    SELECT * FROM load_test.source_wiki_edit;
  • 以下示例以insert_load_wikipedia_ow_2為Label將源表中的數據覆蓋寫入至目標表的p06p12分區中。如果不指定目標分區,數據將會覆蓋寫入全表;如果指定目標分區,數據只會覆蓋寫入指定的分區。

    INSERT OVERWRITE load_test.insert_wiki_edit PARTITION(p06, p12)
    WITH LABEL insert_load_wikipedia_ow_2
    SELECT * FROM load_test.source_wiki_edit;

    如果清空p06p12分區,則查詢不到先前插入至對應分區的數據。

    TRUNCATE TABLE load_test.insert_wiki_edit PARTITION(p06, p12);
    SELECT * FROM load_test.insert_wiki_edit;
    說明

    對于使用列表達式分區方式(PARTITION BY column)的表,INSERT OVERWRITE支持通過指定分區鍵的值在目標表上創建不存在的分區。對于已有的分區,將正常進行覆蓋寫。

    以下示例創建了分區表activity,向其中導入新數據時自動創建了先前不存在的分區:

    CREATE TABLE load_test.activity (
    id INT          NOT NULL,
    dt VARCHAR(10)  NOT NULL
    ) ENGINE=OLAP 
    DUPLICATE KEY(`id`)
    PARTITION BY (`id`, `dt`)
    DISTRIBUTED BY HASH(`id`);
    
    INSERT OVERWRITE load_test.activity
    PARTITION(id='4', dt='2022-01-01')
    WITH LABEL insert_activity_auto_partition
    VALUES ('4', '2022-01-01');
  • 以下示例以insert_load_wikipedia_ow_3為Label將源表中event_timechannel列的數據覆蓋寫入至目標表的對應列中。未被導入的列將被賦予默認值。

    INSERT OVERWRITE load_test.insert_wiki_edit
    WITH LABEL insert_load_wikipedia_ow_3 
    (
        event_time, 
        channel
    )
    SELECT event_time, channel FROM source_wiki_edit;

查看導入任務

您可以通過以下兩種方式來查看導入任務。

  • 方式一:通過EMR StarRocks Manager查看導入任務。詳情請參見查看導入任務詳情。

  • 方式二:通過StarRocks Information Schema庫中的loads視圖查看導入任務的進度。該功能自3.1版本起支持。

    SELECT * FROM information_schema.loads;

    有關loads視圖提供的字段詳情,參見loads。

    如果您提交了多個導入任務,您可以通過LABEL過濾出想要查看的任務。示例如下。

    SELECT * FROM information_schema.loads WHERE LABEL = 'insert_load_wikipedia_ow';

    在返回結果中,STATE顯示導入任務的狀態。

    • 導入任務的狀態為CANCELLED,通過記錄中的ERROR_MSG字段,可以確定導致任務出錯的原因。

    • 導入任務的狀態為FINISHED,表示任務成功。