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