TiDB Lightningデータソース

TiDB Lightningは、CSV、SQL、Parquet ファイルなど、複数のデータ ソースから TiDB クラスターへのデータのインポートをサポートしています。

TiDB Lightningのデータ ソースを指定するには、次の構成を使用します。

[mydumper] # Local source data directory or the URL of the external storage such as S3. data-source-dir = "/data/my_database"

TiDB Lightningの実行中は、パターンdata-source-dirに一致するすべてのファイルが検索されます。

ファイルタイプパターン
スキーマ ファイルCREATE TABLEの DDL ステートメントを含む${db_name}.${table_name}-schema.sql
スキーマ ファイルCREATE DATABASEの DDL ステートメントを含む${db_name}-schema-create.sql
データファイルデータ ファイルにテーブル全体のデータが含まれている場合、ファイルは${db_name}.${table_name}という名前のテーブルにインポートされます。`dbname.{db_name}.{table_name}.${csv
データファイルテーブルのデータが複数のデータ ファイルに分割されている場合は、各データ ファイルのファイル名の末尾に数字を付ける必要があります。`dbname.{db_name}.{table_name}.001.${csv

TiDB Lightningはデータを可能な限り並行して処理します。ファイルは順番に読み取る必要があるため、データ処理の同時実行性はファイル レベル ( region-concurrencyで制御) になります。そのため、インポートしたファイルが大きい場合、インポートのパフォーマンスが低下します。最高のパフォーマンスを実現するには、インポートするファイルのサイズを 256 MiB 以下に制限することをお勧めします。

CSV

スキーマ

CSV ファイルはスキーマレスです。 CSV ファイルを TiDB にインポートするには、テーブル スキーマを提供する必要があります。次のいずれかの方法でスキーマを提供できます。

  • DDL ステートメントを含む${db_name}.${table_name}-schema.sqlおよび${db_name}-schema-create.sqlという名前のファイルを作成します。
  • TiDB でテーブル スキーマを手動で作成します。

Configuration / コンフィグレーション

tidb-lightning.tomlファイルの[mydumper.csv]セクションで CSV 形式を設定できます。ほとんどの設定には、MySQL のLOAD DATAステートメントに対応するオプションがあります。

[mydumper.csv] # The field separator. Can be one or multiple characters. The default is ','. # If the data might contain commas, it is recommended to use '|+|' or other uncommon # character combinations as a separator. separator = ',' # Quoting delimiter. Empty value means no quoting. delimiter = '"' # Line terminator. Can be one or multiple characters. Empty value (default) means # both "\n" (LF) and "\r\n" (CRLF) are line terminators. terminator = '' # Whether the CSV file contains a header. # If `header` is true, the first line is skipped and mapped # to the table columns. header = true # Whether the CSV file contains any NULL value. # If `not-null` is true, all columns from CSV cannot be parsed as NULL. not-null = false # When `not-null` is false (that is, CSV can contain NULL), # fields equal to this value will be treated as NULL. null = '\N' # Whether to parse backslash as escape character. backslash-escape = true # Whether to treat `separator` as the line terminator and trim all trailing separators. trim-last-separator = false

separatordelimiter 、またはterminatorなどの文字列フィールドの入力に特殊文字が含まれる場合、バックスラッシュを使用して特殊文字をエスケープできます。エスケープ シーケンスは、二重引用符で囲まれた文字列 ( "…" ) である必要があります。たとえば、 separator = "\u001f"は ASCII 文字0X1Fをセパレータとして使用することを意味します。

単一引用符で囲まれた文字列 ( '…' ) を使用して、バックスラッシュのエスケープを抑制することができます。たとえば、 terminator = '\n'は、LF \nではなく、バックスラッシュ ( \ ) の後に文字nが続く 2 文字の文字列をターミネータとして使用することを意味します。

詳細については、 TOML v1.0.0 仕様を参照してください。

separator

  • フィールド区切りを定義します。

  • 1 つまたは複数の文字を指定できますが、空にすることはできません。

  • 一般的な値:

    • CSV (コンマ区切り値) の場合は','
    • TSV (タブ区切り値) の場合は"\t"
    • "\u0001"は ASCII 文字を使用します0x01 .
  • LOAD DATA ステートメントのFIELDS TERMINATED BYオプションに対応します。

delimiter

  • 引用に使用する区切り文字を定義します。

  • delimiterが空の場合、すべてのフィールドは引用符で囲まれていません。

  • 一般的な値:

    • '"'は、二重引用符でフィールドを引用します。 RFC4180と同じ。
    • ''は引用を無効にします。
  • LOAD DATAステートメントのFIELDS ENCLOSED BYオプションに対応します。

terminator

  • 行末記号を定義します。
  • terminatorが空の場合、 "\n" (ライン フィード) と"\r\n" (キャリッジ リターン + ライン フィード) の両方が行末記号として使用されます。
  • LOAD DATAステートメントのLINES TERMINATED BYオプションに対応します。

header

  • すべてのCSV ファイルにヘッダー行が含まれているかどうか。
  • headertrueの場合、最初の行が列名として使用されます。 headerfalseの場合、最初の行は通常のデータ行として扱われます。

not-nullおよびnull

  • not-null設定は、すべてのフィールドが null 非許容であるかどうかを制御します。

  • not-nullfalseの場合、 nullで指定された文字列は、特定の値ではなく SQL NULL に変換されます。

  • 引用符は、フィールドが null であるかどうかには影響しません。

    たとえば、次の CSV ファイルでは次のようになります。

    A,B,C \N,"\N",

    デフォルト設定 ( not-null = false; null = '\N' ) では、列ABは両方とも、TiDB にインポートされた後に NULL に変換されます。列Cは空の文字列''ですが、NULL ではありません。

backslash-escape

  • フィールド内のバックスラッシュをエスケープ文字として解析するかどうか。

  • backslash-escapeが true の場合、次のシーケンスが認識され、変換されます。

    順序に変換
    \0空文字 ( U+0000 )
    \bバックスペース ( U+0008 )
    \n改行 ( U+000A )
    \rキャリッジリターン ( U+000D )
    \tタブ ( U+0009 )
    \ZWindows EOF ( U+001A )

    他のすべての場合 (たとえば、 \" ) では、バックスラッシュが取り除かれ、フィールドに次の文字 ( " ) が残ります。左の文字には特別な役割 (区切り文字など) はなく、単なる通常の文字です。

  • 引用符は、バックスラッシュがエスケープ文字として解析されるかどうかには影響しません。

  • LOAD DATAステートメントのFIELDS ESCAPED BY '\'オプションに対応します。

trim-last-separator

  • separatorを行終端記号として扱い、末尾の区切り文字をすべて削除するかどうか。

    たとえば、次の CSV ファイルでは次のようになります。

    A,,B,,
    • trim-last-separator = falseの場合、これは 5 つのフィールド('A', '', 'B', '', '')の行として解釈されます。
    • trim-last-separator = trueの場合、これは 3 つのフィールド('A', '', 'B')の行として解釈されます。
  • このオプションは非推奨です。代わりにterminatorオプションを使用してください。

    既存の構成が次の場合:

    separator = ',' trim-last-separator = true

    構成を次のように変更することをお勧めします。

    separator = ',' terminator = ",\n" # Use ",\n" or ",'\r\n" according to your actual file.

構成不可能なオプション

TiDB Lightningは、 LOAD DATAステートメントでサポートされているすべてのオプションをサポートしているわけではありません。例えば:

  • 行のプレフィックス ( LINES STARTING BY ) は使用できません。
  • ヘッダーはスキップできず ( IGNORE n LINES )、有効な列名でなければなりません。

厳密な形式

TiDB Lightningは、入力ファイルが約 256 MiB の均一なサイズである場合に最適に機能します。入力が単一の巨大な CSV ファイルの場合、 TiDB Lightningは 1 つのスレッドでしかファイルを処理できないため、インポート速度が遅くなります。

これは、最初に CSV を複数のファイルに分割することで修正できます。一般的な CSV 形式の場合、ファイル全体を読み取らずに行の開始位置と終了位置をすばやく特定する方法はありません。したがって、デフォルトでは、 TiDB Lightningは CSV ファイルを自動的に分割しませ。ただし、CSV 入力が特定の制限に準拠していることが確実な場合は、 strict-format設定を有効にして、 TiDB Lightningがファイルを複数の 256 MiB サイズのチャンクに分割して並列処理できるようにすることができます。

[mydumper] strict-format = true

厳密な CSV ファイルでは、すべてのフィールドが 1 行だけを占めます。つまり、次のいずれかに該当する必要があります。

  • 区切り文字が空です。
  • すべてのフィールドにターミネータ自体が含まれているわけではありません。デフォルトの構成では、これはすべてのフィールドに CR ( \r ) または LF ( \n ) が含まれていないことを意味します。

CSV ファイルが厳密ではなく、 strict-formatが誤ってtrueに設定されている場合、複数行にまたがるフィールドが半分に分割されて 2 つのチャンクになり、解析が失敗したり、破損したデータが静かにインポートされたりすることさえあります。

一般的な構成例

CSV

デフォルト設定は、RFC 4180 に従って CSV 用に調整済みです。

[mydumper.csv] separator = ',' # If the data might contain a comma (','), it is recommended to use '|+|' or other uncommon character combinations as the separator. delimiter = '"' header = true not-null = false null = '\N' backslash-escape = true

コンテンツの例:

ID,Region,Count 1,"East",32 2,"South",\N 3,"West",10 4,"North",39

TSV

[mydumper.csv] separator = "\t" delimiter = '' header = true not-null = false null = 'NULL' backslash-escape = false

コンテンツの例:

ID Region Count 1 East 32 2 South NULL 3 West 10 4 North 39

TPC-H DBGEN

[mydumper.csv] separator = '|' delimiter = '' terminator = "|\n" header = false not-null = true backslash-escape = false

コンテンツの例:

1|East|32| 2|South|0| 3|West|10| 4|North|39|

SQL

TiDB Lightningが SQL ファイルを処理するとき、 TiDB Lightningは単一の SQL ファイルをすばやく分割できないため、同時実行性を高めて単一ファイルのインポート速度を向上させることはできません。したがって、SQL ファイルからデータをインポートする場合は、単一の巨大な SQL ファイルを避けてください。 TiDB Lightningは、入力ファイルが約 256 MiB の均一なサイズである場合に最適に機能します。

寄木細工

TiDB Lightningは現在、Amazon Auroraまたは Apache Hive によって生成された Parquet ファイルのみをサポートしています。 S3 のファイル構造を識別するには、次の構成を使用してすべてのデータ ファイルを照合します。

[[mydumper.files]] # The expression needed for parsing Amazon Aurora parquet files pattern = '(?i)^(?:[^/]*/)*([a-z0-9_]+)\.([a-z0-9_]+)/(?:[^/]*/)*(?:[a-z0-9\-_.]+\.(parquet))$' schema = '$1' table = '$2' type = '$3'

この設定は、 Auroraスナップショットによってエクスポートされた寄木細工のファイルを一致させる方法のみを示していることに注意してください。スキーマ ファイルを個別にエクスポートして処理する必要があります。

mydumper.filesの詳細については、 カスタマイズされたファイルに一致を参照してください。

カスタマイズされたファイルを一致させる

TiDB Lightningは、命名パターンに従うデータ ファイルのみを認識します。場合によっては、データ ファイルが命名パターンに従っていない可能性があるため、データ インポートはファイルをインポートせずに短時間で完了します。

この問題を解決するには、 [[mydumper.files]]を使用して、カスタマイズした式でデータ ファイルを一致させることができます。

例として、S3 にエクスポートされたAuroraスナップショットを取り上げます。 Parquet ファイルの完全なパスはS3://some-bucket/some-subdir/some-database/some-database.some-table/part-00000-c5a881bb-58ff-4ee6-1111-b41ecff340a3-c000.gz.parquetです。

通常、 some-databaseのデータベースをインポートするには、 data-source-dirS3://some-bucket/some-subdir/some-database/に設定します。

前述の Parquet ファイル パスに基づいて、 (?i)^(?:[^/]*/)*([a-z0-9_]+)\.([a-z0-9_]+)/(?:[^/]*/)*(?:[a-z0-9\-_.]+\.(parquet))$のような正規表現を記述してファイルを一致させることができます。一致グループでは、 index=1some-databaseindex=2some-tableindex=3parquetです。

デフォルトの命名規則に従わないデータ ファイルをTiDB Lightningが認識できるように、正規表現と対応するインデックスに従って構成ファイルを作成できます。例えば:

[[mydumper.files]] # The expression needed for parsing the Amazon Aurora parquet file pattern = '(?i)^(?:[^/]*/)*([a-z0-9_]+)\.([a-z0-9_]+)/(?:[^/]*/)*(?:[a-z0-9\-_.]+\.(parquet))$' schema = '$1' table = '$2' type = '$3'
  • schema : ターゲット データベースの名前。値は次のとおりです。
    • $1などの正規表現を使用して取得したグループ インデックス。
    • db1など、インポートするデータベースの名前。一致したすべてのファイルがdb1にインポートされます。
  • table : ターゲット テーブルの名前。値は次のとおりです。
    • $2などの正規表現を使用して取得したグループ インデックス。
    • table1など、インポートするテーブルの名前。一致したすべてのファイルがtable1にインポートされます。
  • type : ファイルの種類。 sqlparquet 、およびcsvをサポートします。値は次のとおりです。
    • $3などの正規表現を使用して取得したグループ インデックス。
  • key : 001 in ${db_name}.${table_name}.001.csvなどのファイル番号。
    • $4などの正規表現を使用して取得したグループ インデックス。

その他のリソース

Playground
新規
登録なしで TiDB の機能をワンストップでインタラクティブに体験できます。
製品
TiDB Cloud
TiDB
価格
PoC お問い合わせ
エコシステム
TiKV
TiFlash
OSS Insight
© 2024 PingCAP. All Rights Reserved.
Privacy Policy.