hive默认查询不会显示列名, 当一个表字段比较多的时候,往往看不出值与列之间的对应关系,对日常查错及定位问题带来不便,像下面这样。
  1. hive>
  2. >select * from example_table where dt='2012-03-31-02' limit 2;
  3. OK
  4. NULL    315103  2012-12-24_month
    NULL    10106   2013-01-07_day
    NULL    15368   2013-01-14_day
    NULL    356742  2013-02-28_month
    NULL    14253   2013-03-24_day
  5. Time taken: 1.104 seconds, Fetched: 5 row(s)

开启行转列功能之后:

  1. set hive.cli.print.header=true; // 打印列名
  2. set hive.cli.print.row.to.vertical=true; // 开启行转列功能, 前提必须开启打印列名功能
  3. set hive.cli.print.row.to.vertical.num=1; // 设置每行显示的列数。
  4. > select * from example_table where pt='2012-03-31-02' limit 2;
  5. OK
  6. visitid count   dt
  7. NULL    315103  2012-12-24_month
    NULL    10106   2013-01-07_day
    NULL    15368   2013-01-14_day
    NULL    356742  2013-02-28_month
    NULL    14253   2013-03-24_day
(行列转换功能在公司hive中实验未成功实现,实际上行列转换之后的效果:
vistid=NULL
count=315103  
dt=2012-12-24_month
-------------------------Gorgeous-split-line-----------------------
vistid=NULL
count=10106   
dt=2013-01-07_day
开启行转列功能后, 每一行都已列显示, 值前面都加上列名, 方便问题查找!

 

如果遇到一个hive的问题,如下hive sql:

select f.a,f.b from A t join B f  on ( f.a=t.a and f.ftime=20110802)

该语句中B表有30亿行记录,A表只有100行记录,而且B表中数据倾斜特别严重,有一个key上有15亿行记录,在运行过程中特别的慢,而且在reduece的过程中遇有内存不够而报错。

为了解决用户的这个问题,考虑使用mapjoin,mapjoin的原理:

MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce运行的效率也会高很多

这样就不会由于数据倾斜导致某个reduce上落数据太多而失败。于是原来的sql可以通过使用hint的方式指定join时使用mapjoin。

select /*+ mapjoin(A)*/ f.a,f.b from A t join B f  on ( f.a=t.a and f.ftime=20110802)

再运行发现执行的效率比以前的写法高了好多。

mapjoin还有一个很大的好处是能够进行不等连接的join操作,如果将不等条件写在where中,那么mapreduce过程中会进行笛卡尔积,运行效率特别低,如果使用mapjoin操作,在map的过程中就完成了不等值的join操作,效率会高很多。

例子:

select A.a ,A.b from A join B where A.a>B.a

简单总结一下,mapjoin的使用场景:

1. 关联操作中有一张表非常小

2.不等值的链接操作

Hive使用技巧的更多相关文章

  1. 一起学Hive——总结常用的Hive优化技巧

    今天总结本人在使用Hive过程中的一些优化技巧,希望给大家带来帮助.Hive优化最体现程序员的技术能力,面试官在面试时最喜欢问的就是Hive的优化技巧. 技巧1.控制reducer数量 下面的内容是我 ...

  2. [hive小技巧]使用limit查询变成抽样,而不是全盘扫描

    将set hive.limit.optimize.enable=true 时,limit限制数据时就不会全盘扫,而是根据限制的数量进行抽样. 同时还有两个配置项需要注意: 1.hive.limit.r ...

  3. [hive小技巧]增加hive并行度

    可以通过修改set hive.exec.parallel=true来修改并行度.如果job中并行执行的阶段增多,那么集群利用率会增加.

  4. hive 日常技巧

    --删除表中重复数据 delete from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by ...

  5. hive进阶 技巧

    1.日期格式转换(将yyyymmdd转换为yyyy-mm-dd) select from_unixtime(unix_timestamp('20180905','yyyymmdd'),'yyyy-mm ...

  6. [hive小技巧]同一份数据多种处理

    其实就是from表时,可以插入到多个表. sql语句的模板如下: from history insert overwrite sales select * where actino='purchase ...

  7. Hive原理总结(完整版)

    目录 课程大纲(HIVE增强) 3 1. Hive基本概念 4 1.1 Hive简介 4 1.1.1 什么是Hive 4 1.1.2 为什么使用Hive 4 1.1.3 Hive的特点 4 1.2 H ...

  8. hadoop 数据倾斜

    数据倾斜是指,map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有 ...

  9. java 与大数据学习较好的网站

    C# C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!https://www.cnblogs.com/doforfuture/p/6293926.html ...

随机推荐

  1. 3个div 宽度移入移出时变化

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. Dapper关联查询

    1.一对一: using (IDbConnection connecton = new MySqlConnection(ConfigurationManager.ConnectionStrings[& ...

  3. SQL三大范式三个例子搞定

    第一范式(1NF) (必须有主键,列不可分) 数据库表中的任何字段都是单一属性的,不可再分 create table aa(id int,NameAge varchar(100)) insert aa ...

  4. 大三CS狗一点想法

    本文非技术文 十点半游戏的代码大概完成了1/3,想到今晚提早验收完汇编实验,还是副院长亲自验的,似乎很看好我的样子,然后问我的方向,导师和参加的项目.聊了几句后结束了对话,不禁又引发了我的一些思考. ...

  5. Linux 安装node.js ---- 源码编译的方式

    一 : 普通用户: 安装前准备环境: 1.检查Linux 版本 命令: cat /etc/redhat-release 2.检查 gcc.gcc-c++ 是否安装过 命令: rpm -q gcc rp ...

  6. margin 碰到过的重叠问题

    双倍margin 稍微记录一下,因为常忘 float + margin,实际边距会变成设置值的双倍. 解决办法是 将元素设为 display:inline 最好要了解 IE的 haslayout 问题 ...

  7. extjs学习之Ext.selection.CheckboxModel

    Ext.onReady( function() { var store=Ext.create('Ext.data.Store', { storeId:'simpsonsStore', fields:[ ...

  8. C# 用POST提交json数据

    public void GetResponse(string url, string json) { Encoding encoding = Encoding.UTF8; byte[] data = ...

  9. C与C# socket 跨平台通讯传输结构体

    最近需要写一个C组成的服务器端与C#的客户端进行交互的软件,刚开始写的时候发现C#端解析时候出现了故障,经过仔细研究后发现原因是发送方传输太快,出现了所谓粘包的现象.也就是在C#端的Receive() ...

  10. 服务器内存UDIMM与RDIMM区别

    UDIMM 全称是无缓冲双信道内存模块(Unbuffered Dual In-Lne Memory Modules),它不支持服务器内存满配,就是最高容量了,因为使用UDIMM内存时最大使用每通道只能 ...