设为首页 加入收藏

TOP

hive表自增列实现方法(完全实现表中数据自增列唯一)
2018-12-05 01:16:46 】 浏览:326
Tags:hive 实现 方法 完全 数据 唯一
版权声明:文件随便转载,欢迎大家一起讨论技术,写的不对的地方还请大家一起讨论 https://blog.csdn.net/u012443641/article/details/80018487

Hive表自增列的实现,我在网上找了好久,大都是自己编写UDF(或者是UDAF/UDTF)之类的,或者是直接使用hive的lib库中提供的jar包,加载之后创建方法,然后在hive sql中调用,不过这些都会遇到一个问题:在多map任务的SQL中,每个map处理之后的多个文件,每个文件中的记录都是从1开始自增,并不能真正的实现hive表中所有的记录都有唯一编号,而且是自增的效果。在和别人讨论时,有人提到过一个比较好的方法:

使用shell脚本处理hive表下的文件:

1. 下载hive表对应的文件到linux本地系统。

2. shell命令读取文件的每一行内容,然后在最开始添加自增编号以及行字段分隔符(这个分隔符是在hive建表时指定的,要和建表语句分隔符保持一致),之后将处理之后的该行内容,写入新的文件中。

3. 将新的文件上传到带有自增列的hive表中。

下面是我的代码:

1. 创建原始表,不包含自增列:

CREATE TABLE `test.wzq_matcheducation_temp`(

`userid` bigint,

`value` string)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t'

NULL DEFINED AS ''

STORED AS INPUTFORMAT

'org.apache.hadoop.mapred.TextInputFormat'

OUTPUTFORMAT

'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

location信息:/user/hive/warehouse/test.db/wzq_matcheducation_temp

2. 创建数据表,包含自增列:

CREATE TABLE `test.wzq_matcheducation`(

`id` bigint,

`userid` bigint,

`value` string)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t'

NULL DEFINED AS ''

STORED AS INPUTFORMAT

'org.apache.hadoop.mapred.TextInputFormat'

OUTPUTFORMAT

'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

location信息:/user/hive/warehouse/test.db/wzq_matcheducation

3. 编写hiveSQL,将数据导入原始表:

insert overwrite table test.wzq_matcheducation_temp

select userid, matcheducation

from bidp.user_cloud

where matcheducation like '%8%'

order by userid
4. 编写文件自增列数据处理shell脚本(重要)!!!脚本很简单,自己看吧。
#!/bin/bash

base_path=/home/work/modify_hbase/shell/column_auto_increment

read -p '------请输入要处理的hive表文件对应的目录路径:' hdfs_path_old
read -p '------请输入有自增列的hive表文件对应的目录路径:' hdfs_path_new

echo -e "------`date "+%y/%m/%d %H:%M:%S"`:正在下载hive表对应目录下的所有文件到linux系统中"
rm -rf $base_path/data
mkdir -p $base_path/data/tmp_old
mkdir -p $base_path/data/tmp_new
hadoop fs -get $hdfs_path_old/* $base_path/data/tmp_old
echo -e "------`date "+%y/%m/%d %H:%M:%S"`:hive表对应目录下的所有文件下载完毕"

cd $base_path/data/tmp_old
#给每个文件添加自增列
i=1
for file in $(ls)
do
cat $file | while read line
do
echo -e "$i\t$line" >> $base_path/data/tmp_new/$file
let i++
done
done
echo -e "------`date "+%y/%m/%d %H:%M:%S"`:每个数据文件的自增列添加完毕,开始上传所有处理完的数据文件..."
hadoop fs -put $base_path/data/tmp_new/* $hdfs_path_new
echo -e "------`date "+%y/%m/%d %H:%M:%S"`:数据上传完毕,请手动检查结果:1.查询几条数据;2.查询自增列最大值;3.查询表数据量;4.对比2和3的结果是否一致"

exit 0

下面给出脚本代码截图:

5. 执行脚本:

两个文件路径分别是原始表数据文件路径和数据表数据路径。执行开始之后,查看脚本执行时输出的日志即可。执行完之后,按照脚本中说的方法进行检查即可。

以上就是为hive表添加自增列的方法,不过这个方法也有很多局限性,比如文件内容修改速度很慢(shell脚本读写文件较慢,我觉得可以使用java程序读取hdfs上的文件,然后进行批处理之类的,可以加快文件处理速度)、如果单个文件过大,大量占用机器内存(可以将文件做切割处理)。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇第27天:   lateral View.. 下一篇hive上删除列

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目