impala本身不支持关系型数据库的自增序列,业务需要我们添加一列为自增序列并作为主键,考虑到impala支持udf(用户自定义函数),于是用udf实现了,下面说说我的实现思路。

  1. 构建udf环境,pom引入依赖包

    impala实现自增序列udf

  2. 继承org.apache.hadoop.hive.ql.exec.UDF类,并重写evaluate方法,一定要重写该方法,impala读取的就是该方法。参数可根据自己需要自定义。

    impala实现自增序列udf

  3. 在evaluate方法中实现自己的逻辑。

    由于我需要实现的是自增序列,所以使用了雪花算法SnowFlake,它是推特公司使用的一款通过划分命名空间并行生成的算法,来解决全局唯一ID的需求,类似的还有MongoDB的object_id。想了解的同学可参考我的博客分布式系统生成全剧唯一ID

  4. 将该java项目打jar包

    mvn clean install
    
  5. 上传到hdfs目录

    hdfs dfs -put /tmp/udf/SnowFlake-udf.jar hdfs:///tmp/udf/
    

    hdfs dfs -copyFromLocal ./SnowFlake.jar hdfs:///tmp/udf/
    
  6. 在impala上创建udf函数,在hue的impala查询界面(或者impala shell)中执行

    create function if not exists getSerial(bigint,bigint) returns bigint location 'hdfs:///tmp/udf/SnowFlake-udf.jar' symbol='com.xavier.snowflake.serial.SerialUdf';
    

    SQL说明:

    getSerial(string) returns bigint: 注册的方法名为getSerial,输入参数类型为(bigint,bigint),返回值类型为bigint

    location ‘hdfs:///tmp/udf/SnowFlake-udf.jar’: UDF方法的jar包位置

    symbol=‘com.xavier.snowflake.serial.SerialUdf’: 自定义UDF的类名

  7. 使用getSerial()调用udf

相关文章: