业务场景大概是这样的,这里由两个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中的示例代码

使用union all 命令之后如何对hive表格进行去重的更多相关文章

  1. 【Hadoop/Hive/mapreduce】系列之使用union all 命令之后如何对hive表格使用python进行去重

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

  2. Bugku-CTF之login2(SKCTF)(hint:union,命令执行)

    Day40   login2(SKCTF) http://123.206.31.85:49165/ SKCTF{xxxxxxxxxxxxxxxxxxxxx} hint:union,命令执行  

  3. hive表格取差集

    hive 求两个集合的差集 业务场景是这样的,这里由两个hive表格A和B A的形式大概是这样的:uid B的形式大概是这样的:uid 我想要得到存在A中但是不存在B中的uid 具体代码如下 sele ...

  4. 使用shell脚本依据分区信息分批次的下载hive表格数据

    今天的业务场景大概是这样的,我想把hive表格下载到本地文件系统,然后把这个文件传送到另一个服务器上. 但是这个业务场景一个核心问题就是说我本地机器内存有限,hive表格大概是70G,我是不可能全部下 ...

  5. Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型

    Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', ...

  6. 【CDN+】 一些常用的Linux命令,crontab+VI+Hive(持续更新)

    前言 本文主要是记录下工作中可能用到的一些linux指令,当作字典查用 Crontab 基本命令 # 安装 yum -y install vixie-cron crontabs#查看状态 servic ...

  7. Git 常用命令速查表(图文+表格)

    一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r ...

  8. spark-sql用hive表格,在spark-submit运行jar包时遇到的问题

    1.编程时无法加载hive包,需要在编译好的spark(用spark-shell启动,用spark-sql能够直接访问hive表)的lib目录下,考出assembly包,为其创建一个maven的rep ...

  9. Git 常用命令速查表(图文+表格)【转】

    转自:http://www.jb51.net/article/55442.htm 一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git comm ...

随机推荐

  1. 部署Cube报错,用户登录失败;280000

    在创建SSAS项目过程中,创建数据源.数据源视图.多维数据集.纬度等一切都没有问题.但是在“进程”这一步的时候,发现总是报错,提示如下. OLE DB 错误: OLE DB 或 ODBC 错误 : 用 ...

  2. 将Android工程打成jar包之后对资源的调用。

    Android工程不能完整的打包成jar包.这个主要是R文件导致的,但是我们可以将除了资源文件中的所有东西都打到jar包中.Activity.View等等类. 提供jar包的同时,还需要提供资源文件. ...

  3. 【Angular JS】网站使用社会化评论插件,以及过程中碰到的坑

    目前正在开发自己的网站,技术上使用Angular JS + Express JS + Mongo DB.由于网站会有文章发布,因此需要有评论功能.评论功能也可以自己开发,但由于现在社会化评论插件很多, ...

  4. 常用HTML富文本编辑器

    常用的HTML富文本编译器UEditor.CKEditor.TinyMCE.HTMLArea.eWebEditor.KindEditor简介   这篇文章主要介绍了常用的HTML富文本编译器UEdit ...

  5. JDBC源码解析

    参考:https://blog.csdn.net/silviakafka/article/details/46225045

  6. c++ stl sort example

    c++ stl sort函数使用举例: #include <iostream> #include<vector> #include<algorithm> #incl ...

  7. union和struct的区别之处,在于内存的共享上

    首先看看union,在c++中,union可能没有多大用处,在c语言中,可能我们要借助其完成很多巧妙的设计,下面是其一个完整的定义: union UTest         {             ...

  8. 关于java中的hashcode和equals方法原理

    关于java中的hashcode和equals方法原理 1.介绍 java编程思想和很多资料都会对自定义javabean要求必须重写hashcode和equals方法,但并没有清晰给出为何重写此两个方 ...

  9. ubuntu查看nvidia显卡状态

    nvidia-smi 连续查看显卡状态 sudo watch nvidia-smi

  10. Html5 web本地存储

    Web Storage是HTML5引入的一个非常重要的功能,可以在客户端本地存储数据,类似HTML4的cookie,但可实现功能要比cookie强大的多,cookie大小被限制在4KB,Web Sto ...