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值相加。