使用union all 命令之后如何对hive表格进行去重
业务场景大概是这样的,这里由两个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表格进行去重的更多相关文章
- 【Hadoop/Hive/mapreduce】系列之使用union all 命令之后如何对hive表格使用python进行去重
业务场景大概是这样的,这里由两个hive表格,tableA 和 tableB, 格式内容都是这样的: uid cate1 cate2 在hive QL中,我们知道union有着自动去重的功能,但是那是 ...
- Bugku-CTF之login2(SKCTF)(hint:union,命令执行)
Day40 login2(SKCTF) http://123.206.31.85:49165/ SKCTF{xxxxxxxxxxxxxxxxxxxxx} hint:union,命令执行
- hive表格取差集
hive 求两个集合的差集 业务场景是这样的,这里由两个hive表格A和B A的形式大概是这样的:uid B的形式大概是这样的:uid 我想要得到存在A中但是不存在B中的uid 具体代码如下 sele ...
- 使用shell脚本依据分区信息分批次的下载hive表格数据
今天的业务场景大概是这样的,我想把hive表格下载到本地文件系统,然后把这个文件传送到另一个服务器上. 但是这个业务场景一个核心问题就是说我本地机器内存有限,hive表格大概是70G,我是不可能全部下 ...
- Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型
Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', ...
- 【CDN+】 一些常用的Linux命令,crontab+VI+Hive(持续更新)
前言 本文主要是记录下工作中可能用到的一些linux指令,当作字典查用 Crontab 基本命令 # 安装 yum -y install vixie-cron crontabs#查看状态 servic ...
- Git 常用命令速查表(图文+表格)
一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r ...
- spark-sql用hive表格,在spark-submit运行jar包时遇到的问题
1.编程时无法加载hive包,需要在编译好的spark(用spark-shell启动,用spark-sql能够直接访问hive表)的lib目录下,考出assembly包,为其创建一个maven的rep ...
- Git 常用命令速查表(图文+表格)【转】
转自:http://www.jb51.net/article/55442.htm 一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git comm ...
随机推荐
- 详解__FILE__与$_SERVER['SCRIPT_FILENAME']的区别
废话不多说 直接上测试代码: <?php //引入的是ceshi4文件夹下的ceshi4.php; require_once './ceshi4/ceshi4.php'; 下面是ceshi4文件 ...
- 【Angular JS】网站使用社会化评论插件,以及过程中碰到的坑
目前正在开发自己的网站,技术上使用Angular JS + Express JS + Mongo DB.由于网站会有文章发布,因此需要有评论功能.评论功能也可以自己开发,但由于现在社会化评论插件很多, ...
- python模块详解 YAML和configparser
YAML模块 主要用来做配置文件用的. yaml格式: 详细参考官方文档:PyYAML configparser模块 同样是用于生成和修改配置文件用的.格式和mysql一样. 生成配置文件 impor ...
- Extjs4如何构造store基类
目标:重写一个BaseStore的基类,它继承自Ext.data.Store基类. autoLoad:true/false 是否自动加载,true时创建store即自动加载,一般适合get方式:fal ...
- redis笔记(一)
redis安装 ubuntu: apt-get install redis-server redis服务 :redis-server 启动客户端 :redis-cli redis简单知识 ...
- HCNA配置RIPv1
1.拓扑图 2.配置 R1 The device is running! ###### <Huawei>sys Enter system view, return user view wi ...
- 洛谷 P1509 找啊找啊找GF
题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七夕这个日子,对于sqybi这 ...
- 概念:RPG游戏中两个兵种互相攻击的逻辑
直接上题目: 解析题目: 根据题目的解析,进行代码的实现: 输出结果: 心得: (1) 当我们面对‘公式结果不是我们想要的’时,应该在脑海里将一个完整的攻击流程进行想象,就会对流程有个更清晰的思路 ( ...
- STM32开发-MDK新建工程及配置
本人也是接触stm32没多久,之前用的MDK是5.1,现在用的是5.13,MDK5.0之前的版本(本人简称旧版)和之后的版本(本人简称新版)新建工程有很大区别.对于刚开始用学stm32的新手来说,基本 ...
- BCB:如何在BCB中使用CodeGuard
www.educity.cn 发布者:xjxyj2006 来源:网络转载 发布日期:2013年12月13日 文章评论 发表文章 一. 为什么写这篇东西 自己在使用 BCB5 写一些程序时需要检查很多东 ...