您可以使用KV2Table转化KV(Key:Value)格式的表为普通表格式。Key转换成表的某列名,Value转成该列在对应行的值。

背景信息

KV表格式定义:Key是列名的index,Value支持BIGINT,DOUBLE和STRING类型。在该组件中可以输入用户定义的key_map表,是列名和Key的映射,但无论是否输入key_map表,该组件都会输出key_map表记录转化后的列名和Key的映射。例如1:10,2:20和3:30。

key_map表格式定义:包含列名和index的映射以及类型信息的col_namecol_indexcol_datatype,这三列类型要求是STRING,当col_datatype缺失时,默认值为double类型。
col_name col_index col_datatype
col1 1 bigint
col2 2 double

KV2Table

PAI-Studio支持通过可视化或PAI命令的方式,配置该组件参数:
  • 可视化方式
    页签 参数 描述
    字段设置 KV列名 KV列名。
    附加列名 附加列名。
    key和value之间分隔符 Key和Value之间分隔符。默认”:”。
    kv对之间分隔符 KV对之间分隔符。默认”,”
    参数设置 是否只截取前1200列 如果转化后列数超过表最大列数1200列后,是否只截取前1200列。
    执行调优 计算核心数 系统根据输入数据量,自动分配训练的实例数量。
    每个核内存大小 系统根据输入数据量,自动分配内存。单位为MB。
  • PAI命令方式
    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 输入表中,参与训练的分区。支持以下格式:
    • Partition_name=value
    • name1=value1/name2=value2:多级格式
    说明 如果指定多个分区,则使用英文逗号(,)分隔。
    所有分区
    kvDelimiter Key和Value之间分隔符。 默认”:”
    itemDelimiter KV对之间分隔符。 默认”,”
    top1200 是否只截取前1200列:
    • true
    • false
    true
    lifecycle 输出表的生命周期。
    coreNum 计算的核心数目,取值为正整数。 系统自动分配
    memSizePerCore 每个核心的内存(单位是兆),取值范围为(100,64*1024) 系统自动分配

KV2Table示例

  • 数据生成
        drop table if exists test;
            create table test as
              select
                *
              from
              (
                select '1:1,2:2,3:-3.3' as kv from dual
                union all
                select '1:10,2:20,3:-33.3' as kv from dual
              ) 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值相加。