メインコンテンツまでスキップ
バージョン: 26.x

データ問題の処理

データを読み込む際、ソースカラムとターゲットカラムのデータ型が一致しないことがあります。システムはこれらの不一致を修正しようとしますが、間違った型、長すぎるフィールド、または間違った精度などの問題がエラーを引き起こす可能性があります。

これらの問題に対処するため、Dorisには2つの主要な設定があります:

  • Strict Mode (strict_mode): エラーのある行を削除するかどうかを決定します。
  • Max Filter Ratio (max_filter_ratio): 読み込み中に削除できるデータの最大許容割合を設定します。

これにより、データ読み込みの問題をより簡単に処理でき、データ管理を堅牢でシンプルに保つことができます。

Strict Mode

strict modeの主な機能は、読み込み中にカラム型変換が失敗するデータ行をフィルタリングすることです。

カラム型変換失敗のフィルタリング戦略

システムはstrict modeの設定に基づいて異なる戦略を採用します:

  • strict modeがOFFの場合:変換に失敗したフィールドはNULLに設定され、これらのNULL値を含む行は正しいデータ行と一緒に読み込まれます。

  • strict modeがONの場合:システムは変換に失敗した行をフィルタリングし、正しいデータ行のみを読み込みます。ここで「変換失敗」とは、元のデータがnon-NULLであるにもかかわらず、カラム型変換後にNULLになる場合を特に指します。関数計算によってNULLになる値は、この種の変換には含まれないことに注意してください。

  • NULL値の処理:正しいデータ行と異常なデータ行の両方にNULL値が含まれる場合があります。ターゲットカラムがNOT NULLとして定義されている場合、NULL値を含むすべての行がフィルタリングされます。

1. TinyIntカラム型の例:

Original Data タイプOriginal Data ExampleValue After TinyInt ConversionStrict ModeResult
NULL\NNULLON/OFFNULL
Non-NULL"abc" or 2000NULLONInvalid (Filtered)
Non-NULL"abc"NULLOFFNULL
Non-NULL11ON/OFFLoaded Successfully
ヒント
  1. Table内のカラムはNULL値を許可します

  2. abc2000の両方が型や精度の問題によりTinyIntへの変換後にNULLになります。strict modeがONの場合、そのようなデータはフィルタリングされます。OFFの場合、NULLが読み込まれます。

2. Decimal(1,0)型の例:

Original Data タイプOriginal Data ExampleValue After Decimal ConversionStrict ModeResult
NULL\NNULLON/OFFNULL
Non-NULLaaaNULLONInvalid (Filtered)
Non-NULLaaaNULLOFFNULL
Non-NULL1 or 101 or 10ON/OFFLoaded Successfully
ヒント
  1. Table内のカラムはNULL値を許可します

  2. abcは型の問題によりDecimalへの変換後にNULLになります。strict modeがONの場合、そのようなデータはフィルタリングされます。OFFの場合、NULLが読み込まれます。

  3. 10は範囲を超えていますが、その型はdecimalの要件を満たしているため、strict modeは影響しません。

Strict Modeの有効化

Strict Mode (strict_mode)はデフォルトでFalseです。異なる読み込み方法での設定方法は以下の通りです:

Stream Load

curl --location-trusted -u user:passwd \
-H "strict_mode: true" \
-T data.txt \
http://host:port/api/example_db/test_table/_stream_load

ブローカー負荷

LOAD LABEL example_db.label_1
(
DATA INFILE("s3://bucket/data.txt")
INTO TABLE test_table
)
WITH S3 (...)
PROPERTIES
(
"strict_mode" = "true"
);

Routine Load

CREATE ROUTINE LOAD example_db.job1 ON test_table
PROPERTIES
(
"strict_mode" = "true"
)
FROM KAFKA (...);

MySQL Load

LOAD DATA LOCAL INFILE 'data.txt'
INTO TABLE test_table
PROPERTIES
(
"strict_mode" = "true"
);

Insert Into

SET enable_insert_strict = true;
INSERT INTO test_table ...;

Maximum Filter Ratio

Maximum Filter Ratio(max_filter_ratio)は、ロード中にフィルタされたデータと全データの最大許容比率を定義する重要なロード制御パラメータです。実際のフィルタ比率が設定された最大値を下回る場合、ロードタスクは続行され、フィルタされたデータは無視されます。この比率を超える場合、ロードタスクは失敗します。

Filter Ratio計算方法

  • Filtered Rows: 品質問題によりフィルタされたデータ。型エラー、精度エラー、文字列長制限超過、ファイルの列数不一致、対応するパーティションが存在しないことによりフィルタされた行を含みます。

  • Unselected Rows: Pre-filteringまたはPost-filtering条件によりフィルタされたデータ行。

  • Loaded Rows: 正常にロードされたデータ行。

フィルタ比率は以下のように計算されます:

#Filtered Rows / (#Filtered Rows + #Loaded Rows)

Unselected Rowsはフィルタ比率の計算に含まれないことに注意してください。

最大フィルタ比率の設定

最大フィルタ比率(max_filter_ratio)のデフォルト値は0で、フィルタされたデータは許可されないことを意味します。異なるロード方法での設定方法は以下の通りです:

Stream Load

curl --location-trusted -u user:passwd \
-H "max_filter_ratio: 0.1" \
-T data.txt \
http://host:port/api/example_db/test_table/_stream_load

Brokerの負荷

LOAD LABEL example_db.label_1
(
DATA INFILE("s3://bucket/data.txt")
INTO TABLE test_table
)
WITH S3 (...)
PROPERTIES
(
"max_filter_ratio" = "0.1"
);

Routine Load

CREATE ROUTINE LOAD example_db.job1 ON test_table
PROPERTIES
(
"max_filter_ratio" = "0.1"
)
FROM KAFKA (...);

MySQL Load

LOAD DATA LOCAL INFILE 'data.txt'
INTO TABLE test_table
PROPERTIES
(
"max_filter_ratio" = "0.1"
);

Insert Into

SET insert_max_filter_ratio = 0.1;
INSERT INTO test_table FROM S3/HDFS/LOCAL();```

:::tip
For Insert Into statements, `insert_max_filter_ratio` only takes effect when `enable_insert_strict = false`, and only applies to `INSERT INTO FROM S3/HDFS/LOCAL()` syntax. The default value is 1.0, which means that all abnormal data are allowed to be filtered.
:::