KV to Table是一種用於將索引值對(KV)格式的資料轉換回普通表格式的演算法。該演算法將Key作為表的列名,並將對應的Value填充到相應行的列中,從而恢複資料的表格結構,方便進一步的資料分析和處理。
演算法說明
KV表格式定義:Key是列名的index,Value支援BIGINT和DOUBLE類型。在該組件中可以輸入使用者定義的key_map表,是列名和Key的映射,但無論是否輸入key_map表,該組件都會輸出key_map表記錄轉化後的列名和Key的映射。例如1:10,2:20和3:30。
key_map表格式定義:包含列名和index的映射以及類型資訊的col_name,col_index和col_datatype,這三列類型要求是STRING,當col_datatype缺失時,預設值為double類型。
|
col_name |
col_index |
col_datatype |
|
col1 |
1 |
bigint |
|
col2 |
2 |
double |
配置組件
方式一:可視化方式
在Designer工作流程頁面添加KV to Table組件,並在介面右側配置相關參數:
|
參數類型 |
參數 |
描述 |
|
欄位設定 |
KV列名 |
KV列名。 |
|
附加列名 |
附加列名。 |
|
|
key和value之間分隔字元 |
Key和Value之間分隔字元。預設”:”。 |
|
|
kv對之間分隔字元 |
KV對之間分隔字元。預設”,” |
|
|
參數設定 |
是否只截取前1200列 |
如果轉化後列數超過表最大列數1200列後,是否只截取前1200列。 |
|
執行調優 |
計算核心數 |
系統根據輸入資料量,自動分配訓練的執行個體數量。 |
|
每個核記憶體大小 |
系統根據輸入資料量,自動分配記憶體。單位為MB。 |
方式二:PAI命令方式
使用PAI命令配置KV to Table組件參數。您可以使用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 |
是 |
無 |
輸出索引表名。 |
|
inputKeyMapTableName |
否 |
無 |
輸入索引表名。 |
|
appendColName |
否 |
無 |
附加列名。 |
|
inputTablePartitions |
否 |
所有分區 |
輸入表中,參與訓練的分區。支援以下格式:
說明
如果指定多個分區,則使用英文逗號(,)分隔。 |
|
kvDelimiter |
否 |
預設”:” |
Key和Value之間分隔字元。 |
|
itemDelimiter |
否 |
預設”,” |
KV對之間分隔字元。 |
|
top1200 |
否 |
true |
是否只截取前1200列:
|
|
lifecycle |
否 |
無 |
輸出表的生命週期,取值範圍為[1, 3650]。 |
|
coreNum |
否 |
系統自動分配 |
計算的核心數目,取值為正整數。 |
|
memSizePerCore |
否 |
系統自動分配 |
每個核心的記憶體(單位是兆),取值範圍為(100,64*1024)。 |
樣本
-
資料產生
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; -
PAI命令列
PAI -name KVToTable -project algo_public -DinputTableName=test -DoutputTableName=test_out -DoutputKeyMapTableName=test_keymap_out -DkvColName=kv; -
輸出說明
-
輸出表
+------------+------------+------------+ | kv_1 | kv_2 | kv_3 | +------------+------------+------------+ | 1.0 | 2.0 | -3.3 | | 10.0 | 20.0 | -33.3 | +------------+------------+------------+ -
輸出映射表
+------------+------------+------------+ | col_name | col_index | col_type | +------------+------------+------------+ | kv_1 | 1 | double | | kv_2 | 2 | double | | kv_3 | 3 | double | +------------+------------+------------+
-
演算法規模
轉化後的列包含Append列和KV轉化的列,先輸出KV列再輸出Append列。當總列數超過最大列數限制,且輸出top1200選項為True時,則輸出最大列數,否則報錯,目前輸出表的最大列數為1200列。
資料量不超過1億條記錄。
常見問題
-
Q:如果有輸入key_map表,則轉化的列內容是什嗎?
A:轉化的列是key_map表中的Key和KV表中的Key的交集。
-
Q:如果有輸入key_map表,則轉化後的Key列類型是什嗎?
A:轉化後key列類型和key_map表中一致。如果key_map表無類型,則轉化後key列類型為DOUBLE。
-
Q:如果有輸入key_map表,則轉化後key列名稱的命名規則是什嗎?
A:命名規則為kv列的列名+“”+key。
不支援以下字元:
%&()*+-./;<>=?
-
Q:列名衝突原因是什嗎?
A:如果指定了Append列,且Append列名和轉化後Key列名相同,則會報錯。
-
Q:轉化的列支援什麼類型?
A:只支援數實值型別。
-
Q:列名長度超過128個字元時怎麼辦?
A:列名會被截斷成128個字元。
-
Q:同一行有重複Key時,如何處理?
A:需要將Value值相加。