zoukankan      html  css  js  c++  java
  • 使用zipwithindex 算子给dataframe增加自增列 row_number函数实现自增,udf函数实现自增

    DataFrame df = ...
    StructType schema = df.schema().add(DataTypes.createStructField("id", DataTypes.LongType, false));

    使用RDD的zipWithIndex得到索引,作为ID值:
    JavaRDD<Row> rdd = df
    .javaRDD() // 转为JavaRDD
    .zipWithIndex() // 添加索引,结果为JavaPairRDD<Row, Long>,即行数据和对应的索引
    .map(new Function<Tuple2<Row, Long>, Row>() {
    @Override
    public Row call(Tuple2<Row, Long> v1) throws Exception {
    Object[] objects = new Object[v1._1.size() + 1];
    for (int i = 0; i < v1._1.size(); i++) {
    objects[i] = v1._1.get(i);
    }
    objects[objects.length - 1] = v1._2;
    return RowFactory.create(objects);
    }
    }); // 把索引值作为ID字段值,构造新的行数据

    将RDD再转回DataFrame
    df = sqlContext.createDataFrame(rdd, schema);

    多维数据仓库中的维度表和事实表一般都需要有一个代理键,作为这些表的主键,代理键一般由单列的自增数字序列构成。Hive没有关系数据库中的自增列,但它也有一些对自增序列的支持,通常有两种方法生成代理键:使用row_number()窗口函数或者使用一个名为UDFRowSequence的用户自定义函数(UDF)。
      假设有维度表tbl_dim和过渡表tbl_stg,现在要将tbl_stg的数据装载到tbl_dim,装载的同时生成维度表的代理键。
    用row_number()函数生成代理键
    insert into tbl_dim
    select row_number() over (order by tbl_stg.id) + t2.sk_max, tbl_stg.*
    from tbl_stg
    cross join (select coalesce(max(sk),0) sk_max from tbl_dim) t2;
            上面语句中,先查询维度表中已有记录最大的代理键值,如果维度表中还没有记录,利用coalesce函数返回0。然后使用cross join连接生成过渡表和最大代理键值的笛卡尔集,最后使用row_number()函数生成行号,并将行号与最大代理键值相加的值,作为新装载记录的代理键。
    用UDFRowSequence生成代理键
    add jar hdfs:///user/hive-contrib-2.0.0.jar;
    create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.udfrowsequence';

    insert into tbl_dim
    select row_sequence() + t2.sk_max, tbl_stg.*
    from tbl_stg
    cross join (select coalesce(max(sk),0) sk_max from tbl_dim) t2;
            hive-contrib-2.0.0.jar中包含一个生成记录序号的自定义函数udfrowsequence。上面的语句先加载JAR包,然后创建一个名为row_sequence()的临时函数作为调用UDF的接口,这样可以为查询的结果集生成一个自增伪列。之后就和row_number()写法类似了,只不过将窗口函数row_number()替换为row_sequence()函数。

  • 相关阅读:
    方法重载
    构造方法:(特殊方法,用来创建对象 没写就会默认有构造方法)
    java:第十二章
    java:第九章
    java:第十四章
    java:第十五章
    java:第十一章
    I/O小结
    java:第八章
    java:第六章
  • 原文地址:https://www.cnblogs.com/Mr--zhao/p/11454642.html
Copyright © 2011-2022 走看看