「KV からテーブルへ」コンポーネントは、スパースなキーと値 (KV) 形式のデータを通常の表形式の列に変換します。各キーを列名として、各値を対応するセルの値として使用します。これにより、KV 形式でエンコードされた特徴量データを、下流モデルのトレーニングや分析にすぐに使用できるようになります。
仕組み
各行にカンマ区切りの key:value ペアを含む KV 列があるとします。
入力 — サンプルごとに 1 行、KV 列が 1 つ:
| kv |
|---|
1:1,2:2,3:-3.3 |
1:10,2:20,3:-33.3 |
出力 — キーごとに 1 つの数値列:
| kv_1 | kv_2 | kv_3 |
|---|---|---|
| 1.0 | 2.0 | -3.3 |
| 10.0 | 20.0 | -33.3 |
このコンポーネントは、列名とキーインデックスのマッピングを記録する key_map テーブルも書き出します。
| col_name | col_index | col_type |
|---|---|---|
| kv_1 | 1 | double |
| kv_2 | 2 | double |
| kv_3 | 3 | double |
変換された列は、出力で追加された列の前に表示されます。
基本概念
KV フォーマット
KV 列の各値は、key:value,key:value,... というフォーマットに従う必要があります。ここで、
キーは列名のインデックス (整数) です。
値は BIGINT または DOUBLE 型である必要があります。数値データの型の列のみ変換できます。
行に重複するキーが含まれている場合、コンポーネントはそれらの値を合計します。
key_map テーブル
key_map テーブルは、列名とキーインデックスのマッピングおよびデータの型の情報を記録します。そのスキーマは、3 つの STRING 列を使用します。
| 列 | 説明 |
|---|---|
col_name | 出力列名 |
col_index | キーインデックス |
col_datatype | データの型。指定しない場合、デフォルトで DOUBLE になります |
カスタムの key_map テーブルをインポートして、変換するキーや出力列が使用するデータの型をコントロールできます。key_map テーブルがインポートされると、key_map テーブルと入力 KV 列の両方に存在するキーのみが変換され、出力列のデータの型は key_map テーブルと一致します。
コンポーネントは、key_map テーブルがインポートされたかどうかに関わらず、常に key_map テーブルをエクスポートします。
出力列の命名
出力列名は {kv_column_name}_{key} というパターンに従います。例えば、kv という名前の KV 列とキー 1 は kv_1 を生成します。
列名では、次の文字はサポートされていません: %&()*+-./;<>=?
128 文字を超える名前は 128 文字に切り捨てられます。
追加された列名が変換された列名と一致する場合、コンポーネントはエラーを報告します。
制限事項
最大出力列数:1,200。
top1200がtrueに設定されている場合、出力がこの制限を超えると、コンポーネントは最初の 1,200 列のみをエクスポートします。falseに設定されている場合、コンポーネントは代わりにエラーを報告します。最大入力行数:100,000,000
コンポーネントの設定
方法 1:ビジュアルモデリング
ビジュアルモデリングのパイプラインキャンバスで、「KV からテーブルへ」コンポーネントを設定します。
| タブ | パラメーター | 説明 |
|---|---|---|
| フィールド設定 | KV 列 | キーと値の形式でデータを含む列の名前 |
| フィールド設定 | 追加する列 | 変更せずにそのまま渡す列の名前 |
| フィールド設定 | KV 区切り文字 | キーと値の間の区切り文字。デフォルト: : |
| フィールド設定 | KV ペア区切り文字 | キーと値のペアの間の区切り文字。デフォルト: , |
| パラメーター設定 | 最初の 1,200 列を保持 | 有効にすると、出力が制限を超えた場合に最初の 1,200 列のみをエクスポートします。無効にすると、コンポーネントは代わりにエラーを報告します |
| チューニング | コンピューティングコア | コア数。入力データ量に基づいて自動的に割り当てられます |
| チューニング | コアごとのメモリサイズ | コアごとのメモリ (MB)。入力データ量に基づいて自動的に割り当てられます |
方法 2:PAI コマンド
SQL スクリプトコンポーネントから PAI コマンドを使用してコンポーネントを実行します。詳細については、「SQL スクリプト」をご参照ください。
PAI -name KVToTable
-project algo_public
-DinputTableName=test
-DoutputTableName=test_out
-DoutputKeyMapTableName=test_keymap_out
-DkvColName=kv;| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
inputTableName | はい | — | 入力テーブルの名前 |
kvColName | はい | — | KV 列の名前 |
outputTableName | はい | — | 出力テーブルの名前 |
outputKeyMapTableName | はい | — | 出力 key_map テーブルの名前 |
inputKeyMapTableName | いいえ | — | キーと列のマッピングをコントロールするための入力 key_map テーブルの名前 |
appendColName | いいえ | — | 変更せずにそのまま渡す列の名前 |
inputTablePartitions | いいえ | すべてのパーティション | 入力テーブルから読み取るパーティション。フォーマット: Partition_name=value。複数レベルのパーティションの場合: name1=value1/name2=value2。複数のパーティションはカンマで区切ります |
kvDelimiter | いいえ | : | キーと値の間の区切り文字 |
itemDelimiter | いいえ | , | キーと値のペアの間の区切り文字 |
top1200 | いいえ | true | 出力が制限を超えた場合に、最初の 1,200 列のみをエクスポートするかどうか。false に設定すると、代わりにエラーが報告されます |
lifecycle | いいえ | — | 出力テーブルのライフサイクル |
coreNum | いいえ | システムが決定 | コア数。正の整数である必要があります |
memSizePerCore | いいえ | システムが決定 | コアごとのメモリ (MB)。有効範囲: (100, 65536) |
例
入力テーブルを作成します。
DROP TABLE IF EXISTS test; CREATE TABLE test AS SELECT * FROM ( SELECT '1:1,2:2,3:-3.3' AS kv UNION ALL SELECT '1:10,2:20,3:-33.3' AS kv ) tmp;「KV からテーブルへ」コンポーネントを実行します。
PAI -name KVToTable -project algo_public -DinputTableName=test -DoutputTableName=test_out -DoutputKeyMapTableName=test_keymap_out -DkvColName=kv;出力テーブル (
test_out) を確認します。kv_1 kv_2 kv_3 1.0 2.0 -3.3 10.0 20.0 -33.3 key_map テーブル (
test_keymap_out) を確認します。col_name col_index col_type kv_1 1 double kv_2 2 double kv_3 3 double
よくある質問
key_map テーブルを提供した場合、どの列が変換されますか?
key_map テーブルと入力 KV 列の両方にキーが表示される列のみが変換されます。
key_map テーブルを提供した場合、出力列はどのデータの型を使用しますか?
出力列は、key_map テーブルの col_datatype 列で指定されたデータの型を使用します。col_datatype が指定されていない場合、出力はデフォルトで DOUBLE になります。
列名の競合が発生するのはなぜですか?
追加された列が変換されたキー列と名前を共有している場合、コンポーネントはエラーを報告します。コンポーネントを実行する前に、競合する列のいずれかの名前を変更してください。
どの列タイプが変換できますか?
数値データの型の列のみ変換できます。
列名が 128 文字を超えるとどうなりますか?
最初の 128 文字のみが保持されます。
行に重複するキーが含まれている場合はどうなりますか?
コンポーネントは重複するキーの値を合計します。