您可以使用KV2Table转化KV(Key:Value)格式的表为普通表格式。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 |
组件配置
您可以使用以下任意一种方式,配置KV2Table组件参数。
方式一:可视化方式
在Designer工作流页面配置组件参数。
页签 | 参数 | 描述 |
字段设置 | KV列名 | KV列名。 |
附加列名 | 附加列名。 | |
key和value之间分隔符 | Key和Value之间分隔符。默认”:”。 | |
kv对之间分隔符 | KV对之间分隔符。默认”,” | |
参数设置 | 是否只截取前1200列 | 如果转化后列数超过表最大列数1200列后,是否只截取前1200列。 |
执行调优 | 计算核心数 | 系统根据输入数据量,自动分配训练的实例数量。 |
每个核内存大小 | 系统根据输入数据量,自动分配内存。单位为MB。 |
方式二:PAI命令方式
使用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 | 是 | 输出索引表名。 | 无 |
inputKeyMapTableName | 否 | 输入索引表名。 | 无 |
appendColName | 否 | 附加列名。 | 无 |
inputTablePartitions | 否 | 输入表中,参与训练的分区。支持以下格式:
说明 如果指定多个分区,则使用英文逗号(,)分隔。 | 所有分区 |
kvDelimiter | 否 | Key和Value之间分隔符。 | 默认”:” |
itemDelimiter | 否 | KV对之间分隔符。 | 默认”,” |
top1200 | 否 | 是否只截取前1200列:
| true |
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值相加。