hive数据表去重方法

2023-11-17

1、hive 0.8.0数据表去重方法

问题描述:hive的外部表test中,在若干字段上存在重复现象,现在需要将若干字段上值相同的多条记录,只保其中留一条,
          舍弃其余的。
         
解决思路:
   (1)group by的方法
   
     首先新建与test表完全相同的新表test_pure,然后利用group by在有相同值的若干字段上进行分组统计,正常情况下,hive sql的select是无法取到非group by的字段,采用
collect_set(非group by字段)[0],从分组统计的非group by字段值集合中,取到其中一个,按此方式取得所有非group by字段,然后将
所有字段的值,insert 到新建的表中。

    a、建表
       set mapred.job.name = 'chachong';
             set mapred.job.map.capacity = 300;
       set mapred.job.reduce.capacity = 300;
             set hive.exec.reducers.max = 300;
             set hive.mapred.mode=nonstrict;
           set hive.map.aggr=true;
             set hive.groupby.skewindata=true;
       set mapred.job.priority=VERY_HIGH;

             db = database me;
             use db;
             drop table if exists yuliao_pure;
       create external table if not exists yuliao_pure(
            content_id string,
            content string,
            host string,
            subject string,
            brand string,
            industry string,
            critic string,
            time string
                )
                partitioned by (dt string)
                row format delimited
                fields terminated by '\t'
                lines terminated by '\n'
                stored as textfile;
    
    b、去重
    
insert into table test_pure
partition (dt='${hivevar:new_dt}')
select
    collect_set(content_id)[0],
    content,
    collect_set(host)[0],
    collect_set(subject)[0],
    collect_set(brand)[0],
    collect_set(industry)[0],
    collect_set(critic)[0],
    time
from
    test
where
    industry="aaa"
    and time like '%201501%'
    and dt >= "20150520"
    and dt <= "20151027"
group by  
    content,time;
    

2、利用row_number去重

由于的hive.0.11.0版本加入了对row_number()的内建函数的支持,但是0.8.0仍然不支持,因此通过编写UDF内建函数来完成,具体如下:

(1)下载hive-exec-1.0.1.jar;

(2)编写row_number的用户自定义的UDF;

package com.blue.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class RowNumber extends UDF {
    private static int MAX_VALUE = 50;
    private static String comparedColumn[] = new String[MAX_VALUE];
    private static int rowNum = 1;
    
    public int evaluate(Object... args)
    {
        String columnValue[] = new String[args.length];
        for (int i = 0; i < args.length; i++)
            columnValue[i] = args[i].toString();
        if (rowNum == 1)
        {
            for (int i = 0; i < columnValue.length; i++)
                comparedColumn[i] = columnValue[i];
        }
        for (int i = 0; i < columnValue.length; i++)
        {
            if (!comparedColumn[i].equals(columnValue[i]))
            {
                for (int j = 0; j < columnValue.length; j++)
                {
                    comparedColumn[j] = columnValue[j];
                }
                rowNum = 1;
                return rowNum++;
            }
        }
        return rowNum++;
    }
}

该类继承自hive的UDF类,该类是按若干列的值进行分组,在相同组内对记录进行编号。每扫描一行记录,该类的evaluate方法就会被执行,evaluate方法的内部逻辑是:comparedColumn数组用于跟踪上一条记录的分组列的值,碰到上一条记录在若干列上的值与当前记录的若干列的值相同,便将rowNumber++,一旦碰到值不同的

便将当前记录的若干列的值赋给comparedColumn数组,作为新的编号起点,依次下去,直到扫描完所有记录为止。

(3)将该类生成jar文件,打jar包时,不用将hive-exec-1.0.1.jar一块儿打入,rz -be 上传该jar文件到某一路径下;

(4)内建函数的使用方法,如下:

add jar /home/work/zcc/data_checksame/blueudf.jar;
create temporary function row_number as 'com.blue.hive.udf.RowNumber';

insert into table test_pure  
select
  t.content_id,t.content,t.host,t.subject,t.brand,t.industry,t.critic,t.time
from   
  ( select
     content_id,content,host,subject,brand,industry,critic,time,
     row_number() over (distribute by content,time sort by time) as rn  
     from yuliao
     where
     industry="${hivevar:industry}"
     and time like '%${hivevar:month}%'
     and dt in ("20150521")

    ) t where t.rn=1;

总结:(1)hive如何获取非group by字段;

            (2)hive表的查重策略;

            (3)hive表的UDF使用方法;

            (4) Execution Error, return code [-101] (unknow error) from org.apache.hadoop.hive.ql.exec.FunctionTask异常解决方法,务必保证UDF的编译jdk版本与运行hive的jdk版本保持一致。

后续提供hive表的不同查重方法的优化性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hive数据表去重方法 的相关文章

随机推荐

  • 常用运放电路分析

    1 运算放大器电路分析方法 由于运放的电压放大倍数很大 一般通用型运算放大器的开环电压放大倍数都在80 dB以上 而运放的输出电压是有限的 一般在 10 V 14 V 因此运放的差模输入电压不足1 mV 两输入端近似等电位 相当于 短路 开
  • 亚马逊云科技云技能学习

    文章目录 前言 一 云技能学习的优势 二 云技能学习的学习路径 三 云技能学习的未来前景 总结 前言 亚马逊云科技 Amazon Web Services AWS 作为全球领先的云计算服务提供商 提供了众多创新的云技术解决方案 在这些方案中
  • [转载]一分钟讲明白区块链数据不可篡改和51%攻击原理

    转载 一分钟讲明白区块链数据不可篡改和51 攻击原理 如果你回家过年需要向亲戚朋友讲区块链 这篇文章能让你一分钟讲明白区块链最大的优点 数据不可篡改 图片发自简书App 第1章 不可篡改的数据库其实并不新鲜 我们都有微信群 微信群的聊天记录
  • Swing组件中面板(JPanel)的使用

    JPanel组件定义面板实际上是一种容器组件 用来容纳各种其他轻量级组件 此外 用户还可以用这种面板容器绘制图形 JPanel的构造方法如下 JPanel 创建具有双缓冲和流布局 FlowLayout 的面板 JPanel LayoutMa
  • SadTalker 让图片说话

    参考 https github com OpenTalker SadTalker 其他类似参考 https www d id com 输入图片加音频产生2d视频 安装使用 1 拉取github 下载对应安装库 2 下载对应模型baidu网盘
  • Windows如何开机自动全屏打开chrome浏览器

    创建一个bat文件 C Program Files Google Chrome Application chrome exe explicitly allowed ports 10080 18080 start fullscreen url
  • 【嵌入式】用STM32F103c8t6芯片完成对SD卡的数据读写

    目录 一 SD卡协议 1 SD卡的体系架构 2 SD卡寄存器列表 3 SD卡初始化 SPI模式 4 SD卡读写 SPI模式 二 STM32CubeMX 三 Keil代码修改 四 电路连接 五 烧录运行结果 六 心得体会 七 参考链接 一 S
  • Linux tcpdump抓包命令

    1 tcpdump抓包命令 c 指定抓取包的数量 即最后显示的数量 i 指定tcpdump监听的端口 未指定 选择系统中最小的以配置端口 i any 监听所有网络端口 i lo 监听lookback接口 nn 对监听地址以数字方式呈现 且对
  • 新版TCGA的突变数据SNP下载和整理

    关于TCGAbiolinks包的学习前面一共介绍了5篇推文 今天继续学习如何使用TCGAbiolinks下载和整理MAF格式的突变数据 之前的TCGA的MAF文件是可以下载的 每个癌症包含4种软件得到的突变文件 后来就改版了 不让你随便下载
  • 网络篇 OSPF的路由器类型-42

    OSPF路由器类型 在OSPF初篇的时候 就说到了OSPF是一种比EIGRP协议更加复杂的大型网络配置协议 它的路由器类型也分为了好几种 现在我们通过下图来了解一个OSPF路由器类型 1 内部路由器 所有的接口都接入到同一个区域中的路由器
  • 自定义类型——结构体、枚举、联合

    一 结构体 我们知道 数组是将相同类型的元素放在一起 类似于数组 结构体是将相同或不同的元素放在一起 eg struct example example是结构体名 可以省略 但不建议省略 内部的是结构体成员 int a char c flo
  • 冲量在线创始人刘尧:以信创软硬件结合场景为突破口“占山为王”

    数据大爆炸的时代 发展信创 保证数据的安全与流通便成为刻不容缓的议题 专注于数据智能互联解决方案的科技创新企业冲量在线 致力于促进数据生产要素在社会间的互联互通 构建可信 安全 隐私 公平 高效的 数据互链网 作为隐私计算结合信创的先行者
  • php简单密码验证txt,php用户名和密码的简单验证

    5 php页面提交form表单 username password 5 1 php页面接收form表单 并进行处理 设置用户名和密码 arr user array user pwd arr pwd array user gt 1111 pw
  • React 生命周期

    React 类组件的生命周期 就是组件从创建到消耗的过程 只有类组件才有生命周期 分为 挂载阶段 更新阶段 卸载阶段 挂载阶段 钩子函数 constructor 创建组件时 最先执行 作用 初始化 state 创建 Ref 使用 bind
  • 单机版kubernetes

    Kubernetes 集群的搭建是有一定难度的 官方安装推荐了MiniKube作为单机调试 学习 1 centos安装 1 1 先决条件 安装VirtualBox KVM Note Minikube 也支持 vm driver none 选
  • 【leecode】小练习(简单8题)

    def twoSum nums target 给定 nums 2 7 11 15 target 9 因为 nums 0 nums 1 2 7 9 所以返回 0 1 type nums List int type target int rty
  • nfs漏洞的处理:目标主机showmount -e信息泄露(CVE-1999-0554)

    文章目录 前言 一 漏洞内容 二 配置现状 1 nfs server节点 etc exports文件的配置 2 client节点执行showmount e 测试 三 nfs server节点增加访问控制的配置 1 etc hosts all
  • Node.js中Redirect拼接参数方法,带参数重定向

    一 在Node js里req redirect 里拼接URL是这样的 client1 req query client client1是你获取到的需要拼接的变量 res redirect allNode client client1 注意冒
  • openstack实战之使用sysprep工具封装windows7镜像

    openstack实战之使用sysprep工具封装windows7镜像 在openstack云平台环境下 使用sysprep封装windows7系统主要目的是清理虚拟机的SID 避免使用同一windows7镜像克隆出的虚拟机出现相同的SID
  • hive数据表去重方法

    1 hive 0 8 0数据表去重方法 问题描述 hive的外部表test中 在若干字段上存在重复现象 现在需要将若干字段上值相同的多条记录 只保其中留一条 舍弃其余的 解决思路 1 group by的方法 首先新建与test表完全相同的新