业务场景大概是这样的,这里由两个hive表格,tableA 和 tableB, 格式内容都是这样的:

uid cate1 cate2

在hive QL中,我们知道union有着自动去重的功能,但是那是真对几行内容完全一致的情况下才可以。现在我们要进行去重的情况是根据uid进行去重。

也就是说可能存在这种情况:

1234 老师 唱歌

1234 老师 跳舞

对于hive表格中的这两行数据我们只想要保留其中的一行。

针对这种情况,我们做的大致思路就是,取两个表格数据的时候同时人为加上一个flag,然后使用python代码根据flag进行区分保留。

为了进行去重,我们写了两个代码,一个是取得hive数据的shell脚本,一个是处理hive数据的python脚本

vim get_data.sh
function merge(){
cat <<EOF
add file ./process.py;
select transform(a.*) using 'python tt.py' as uid,cate1,cate2 from (select * from
(select uid,cate1,cate2,"0" as flag from tableA where dt='sth1'
union all
select uid,cate1,cate2,"1" as flag from tableB where dt='sth2'
)ts
distribute by uid sort by uid,flag asc
)a
EOF
}

对于上面这个代码,我觉得有一点需要特别注意,就是

distribute by uid sort by uid,flag asc

为了了解这行代码,我特意去看了看这里的解释参考

简单来说就是说,distribute by uid代表的就是所有uid相同的数据会被送到同一个reducer中去处理。

vim process.py

#!/bin/env python
#-*- encoding:utf-8 -*-
import os
import sys def set_values(value):
if value.isdigit():
return int(value)
else :
return 0 lastuid=""
cate1=""
cate2=""
flag="" for line in sys.stdin :
line=line.replace("\n","").replace(" ","")
v=line.split("\t")
try :
uid=v[0]
if not uid.isdigit() or len(v) != 4:
pass
if lastuid!="" and lastuid!=uid:
print (lastuid+"\t"+str(cate1)+"\t"+str(cate2))
lastuid=""
cate1=""
cate2=""
flag=""
cate1=v[1]
cate2=v[2]
flag=v[3]
lastuid=uid
except :
pass print (lastuid+"\t"+str(cate1)+"\t"+str(cate2)) #这行代码是为了输出最后一行,这行代码很类似于python word count中的示例代码

【Hadoop/Hive/mapreduce】系列之使用union all 命令之后如何对hive表格使用python进行去重的更多相关文章

  1. 使用union all 命令之后如何对hive表格进行去重

    业务场景大概是这样的,这里由两个hive表格,tableA 和 tableB, 格式内容都是这样的: uid cate1 cate2 在hive QL中,我们知道union有着自动去重的功能,但是那是 ...

  2. Hadoop Hive概念学习系列之hive里的JDBC编程入门(二十二)

    Hive与JDBC示例 在使用 JDBC 开发 Hive 程序时, 必须首先开启 Hive 的远程服务接口.在hive安装目录下的bin,使用下面命令进行开启: hive -service hives ...

  3. Hadoop Hive概念学习系列之hive三种方式区别和搭建、HiveServer2环境搭建、HWI环境搭建和beeline环境搭建(五)

     说在前面的话 以下三种情况,最好是在3台集群里做,比如,master.slave1.slave2的master和slave1都安装了hive,将master作为服务端,将slave1作为服务端. 以 ...

  4. Hadoop Hive概念学习系列之hive里的索引(十三)

    Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapReduce任务中需要 ...

  5. Hadoop Hive概念学习系列之hive的索引及案例(八)

    hive里的索引是什么? 索引是标准的数据库技术,hive 0.7版本之后支持索引.Hive提供有限的索引功能,这不像传统的关系型数据库那样有“键(key)”的概念,用户可以在某些列上创建索引来加速某 ...

  6. Hadoop Hive概念学习系列之hive里的优化和高级功能(十四)

    在一些特定的业务场景下,使用hive默认的配置对数据进行分析,虽然默认的配置能够实现业务需求,但是分析效率可能会很低. Hive有针对性地对不同的查询进行了优化.在Hive里可以通过修改配置的方式进行 ...

  7. 从Hadoop骨架MapReduce在海量数据处理模式(包括淘宝技术架构)

    从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到,以致后来初次接触Hadoop与MapReduce这两个东西,我便稍显兴奋,认为它们非常是神奇.而神奇的东西常能勾 ...

  8. 【SQL系列】深入浅出数据仓库中SQL性能优化之Hive篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SQL系列]深入浅出数据仓库中SQL性能优化之 ...

  9. Hadoop学习笔记系列

    Hadoop学习笔记系列   一.为何要学习Hadoop? 这是一个信息爆炸的时代.经过数十年的积累,很多企业都聚集了大量的数据.这些数据也是企业的核心财富之一,怎样从累积的数据里寻找价值,变废为宝炼 ...

随机推荐

  1. BZOJ 4668: 冷战 并查集&&暴力LCA(雾)

    利用并查集按秩合并,保存每个点合并的时间: 求时间时,就一直跳u=fa[u],并记录路径上时间的最大值,代表最后一次合并的时间 #include<cstdio> #include<i ...

  2. 基于.NetCore2.1。服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务

    基于.NetCore2.1.服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务 https://www.cnblogs.com/ibeisha/p/weixinServ ...

  3. NET高性能IO

    System.IO.Pipelines: .NET高性能IO https://www.cnblogs.com/xxfy1/p/9290235.html System.IO.Pipelines是一个新的 ...

  4. this、apply、call的指向

    1.关于this this它总是返回一个对象,是指调用当前函数的对象,由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的. var person={ name: ...

  5. IDEA SpringBoot +thymeleaf配置

    1.pom添加以下依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  6. iOS优化

    load妙用 aop面向切面编程 NSNumber Or Int @()适配64位 经过漫长时间的学习 你终于掌握了iOS大法 你找到了份iOS开发的工作 信誓旦旦的要开始你的coding生涯 老板对 ...

  7. SharePoint 2013 安装配置(3-1)

    在第二部分中,我向您展示了如何在Windows Server 2012 R2 for SharePoint 2013上设置Active Directory域服务.现在我们应该能够在Active Dir ...

  8. Python3+Selenium3+webdriver学习笔记11(cookie处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...

  9. HDU 2147 kiki's game kiki的游戏(博弈,找规律)

    题意: 给一个有n*m 个格子的棋盘,将一个硬币放在右上角一格,每次可以往左/下/左下移动一格,碰到不能移动的局面者输. 思路: 找P/N状态.先将(n,1)归为P状态,那么能一步到达此位置的有3个位 ...

  10. 日常-acm-鸡兔同笼

    已知鸡和兔总数量n,总腿数m.输入n和m,依次输出鸡的数量和兔的数量.如果无解,则输出No answer. 样例输入: 14 32 样例输出: 12 2 样例输入: 10 16 样例输出: No an ...