本博文的主要内容如下:

  .hive的详细官方手册

      .hive支持的数据类型

     .Hive Shell

  .Hive工程所需依赖的jar包 

  .hive自定义函数

  .分桶4

     .附PPT

hive的详细官方手册

http://hive.apache.org/

https://cwiki.apache.org/confluence/display/Hive/LanguageManual

  标准的SQL,hive都支持。

这就是,为什么目前hive占有市场这么多,因为,太丰富了,当然,Spark那边的Spark SQL,也在不断地进步。

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

  非常多,自行去研究,这里不多赘述。

将查询结果,写到本地文件或hdfs里的文件

//write to hdfs

insert overwrite local directory '/home/hadoop/hivetemp/test.txt' select * from tab_ip_part where part_flag='part1';    //路径可以是Linux本地的

insert overwrite directory '/hiveout.txt' select * from tab_ip_part where part_flag='part1';  //路径也可以是hdfs里的

这里,不演示

//array

create table tab_array(a array<int>,b array<string>)
row format delimited
fields terminated by '\t'
collection items terminated by ',';

示例数据

tobenbrone, laihama,woshishui     13866987898,13287654321
abc,iloveyou,itcast 13866987898,13287654321
select a[0] from tab_array;
select * from tab_array where array_contains(b,'word');
insert into table tab_array select array(0),array(name,ip) from tab_ext t;

//map

create table tab_map(name string,info map<string,string>)
row format delimited
fields terminated by '\t'
collection items terminated by ';'
map keys terminated by ':';

示例数据:

fengjie                         age:18;size:36A;addr:usa
furong age:28;size:39C;addr:beijing;weight:180KG
load data local inpath '/home/hadoop/hivetemp/tab_map.txt' overwrite into table tab_map;
insert into table tab_map select name,map('name',name,'ip',ip) from tab_ext;

  这里,不多赘述。

//struct

create table tab_struct(name string,info struct<age:int,tel:string,addr:string>)
row format delimited
fields terminated by '\t'
collection items terminated by ','
load data local inpath '/home/hadoop/hivetemp/tab_st.txt' overwrite into table tab_struct;
insert into table tab_struct select name,named_struct('age',id,'tel',name,'addr',country) from tab_ext;

  这里,不多赘述。

Hive Shell

//cli shell

hive -S -e 'select country,count(*) from tab_ext' > /home/hadoop/hivetemp/e.txt 

  有了这种执行机制,就使得我们可以利用脚本语言(bash shell,python)进行hql语句的批量执行

select * from tab_ext sort by id desc limit 5;

select a.ip,b.book from tab_ext a join tab_ip_book b on(a.name=b.name);

  思考一个问题:就说,一个业务场景里面,写sql语句去分析作统计,往往不是一句sql语句能搞定的,sql对一些字段或函数或自定义函数处理会得出一些中间结果,中间结果存在中间表里,然后,才可进入下一步的处理。可能,你需写好多条sql语句,按照批量,流程去走,以前在关系型数据库里,是按照流程处理过程做的。

  hive里,不支持存储过程的语法,那若有一个模型,这个模型里有十几个sql语句,一条一条写很麻烦,那么,hive在想,能不能组织成批量去运行呢?则借外部的工作(如写一个shell脚本,执行十几个sql语句)

  可以参照

Sqoop 脚本开发规范(实例手把手带你写sqoop export和sqoop import)

在shell下,接收。

//cli shell

hive -S -e 'select country,count(*) from tab_ext' > /home/hadoop/hivetemp/e.txt 

  有了这种执行机制,就使得我们可以利用脚本语言(bash shell,python)进行hql语句的批量执行

select * from tab_ext sort by id desc limit 5;
select a.ip,b.book from tab_ext a join tab_ip_book b on(a.name=b.name);

  如业务场景里,

  有了这种执行机制,就使得我们可以利用脚本语言(bash shell,python)进行hql语句的批量执行。

bash shell和python是最常用的两种脚本语言。

新建包,cn.itcast.bigdata

新建,PhoneNbrToArea.java

编写代码

解压

  为了方便,把D:\SoftWare\hive-0.12.0\lib的jar包,全导入进去,但是,还要导入hadoop-core-***.Jar。(初学,还是手动吧!)

  查阅了一些资料。在hive工程,所依赖的jar包,一般都是有如下就好了。12个jar包。

http://xiaofengge315.blog.51cto.com/405835/1408512

http://blog.csdn.net/haison_first/article/details/41051143

commons-lang-***.jar

commons-logging-***.jar

commons-logging-api-***.jar

hadoop-core-***.jar

hive-exec-***.jar

hive-jdbc-***.jar

hive-metastore-***.jar

hive-service-***.jar

libfb***.jar

log4j-***.jar

slf4j-api-***.jar

sl4j-log4j-***.jar

说明,注意了,在hadoop-2.X版本之后,hadoop-core-***.jar,没有了,被分散成其他的jar包了。以前,是放在hadoop压缩包下的share目录下的

http://zhidao.baidu.com/link?url=KI6ZkudqskDjAthYc2PtTlmB_3FhR3OaMzm4Wcrl_oCkaJfBhaTd7mHSHsy1lkPYO8xa0EGhpD8RSnYdnpkDkGiZX04qff3ul3-xX-cOi07

  2.x系列已经没有hadoop-core的jar包了,变成一个个散的了,像下面这样

  鉴于此,因为,hive工程依赖于hive jar依赖包,日志jar包。

由于hive的很多操作依赖于mapreduce程序,因此,hive工程中还需引入hadoop包。

udf和jdbc连接hive需要的jar包,基本是最简的了。

在这一步,各有说法,但是确实,是不需要全部导入,当然,若是图个方便,可全部导入。

我这里,hadoop的版本是,hadoop-2.4.1,hive的版本是,hive-0.12.0。(因为,这个是自带的)

再谈hive-1.0.0与hive-1.2.1到JDBC编程忽略细节问题

Hive工程所需依赖的jar包 

总结:就是将D:\SoftWare\hadoop-2.4.1\share\hadoop\common下的hadoop-common-2.4.1.jar

,以及D:\SoftWare\hive-0.12.0\lib\下的所有。即可。(图个方便)!

当然,生产里,不建议这么做。

也参考了网上一些博客资料说,不需这么多。此外,程序可能包含一些间接引用,以后再逐步逐个,下载,添加就是。复制粘贴到hive-0.12.0lib 里。

去 http://mvnrepository.com/ 。

  参考我的博客

Eclipse下新建Maven项目、自动打依赖jar包

2 weekend110的HDFS的JAVA客户端编写 + filesystem设计思想总结

weekend110-hive   ->   Build Path   ->  Configure Build Path

总结:就是将D:\SoftWare\hadoop-2.4.1\share\hadoop\common下的hadoop-common-2.4.1.jar

,以及D:\SoftWare\hive-0.12.0\lib\下的所有。即可。(图个方便)!

D:\SoftWare\hive-0.12.0\lib\下的所有

D:\SoftWare\hadoop-2.4.1\share\hadoop\common下的hadoop-common-2.4.1.jar

package cn.itcast.bigdata;
import java.util.HashMap;
import org.apache.hadoop.hive.ql.exec.UDF; public class PhoneNbrToArea extends UDF{
private static HashMap<String, String> areaMap = new HashMap<>();
static {
areaMap.put("1388", "beijing");
areaMap.put("1399", "tianjin");
areaMap.put("1366", "nanjing");
} //一定要用public修饰才能被hive调用
public String evaluate(String pnb) {
String result = areaMap.get(pnb.substring(0,4))==null? (pnb+" huoxing"):(pnb+" "+areaMap.get(pnb.substring(0,4)));
return result;
}
}

默认是/root/下,

这里,我改下到/home/hadoop/下

//UDF

select if(id=1,first,no-first),name from tab_ext;

hive>add jar /home/hadoop/myudf.jar;
hive>CREATE TEMPORARY FUNCTION my_lower AS 'org.dht.Lower';
select my_upper(name) from tab_ext;

 hive自定义函数

接下来,创建hive自定义函数,来与它关联。Hive自带的函数是永久,我们自定义的函数是TEMPORARY。

得要去掉, 不然后续处理,会出现问题。

  在企业里,使用hive是有规范步骤的,一般在采用元数据,自动用mapreduce程序,清洗之后,再给hive。

  数据采集  -》   数据清洗   -> 数据归整   ->   再交给hive

分桶

  注意:普通表(外部表、内部表)、分区表这三个都是对应HDFS上的目录,桶表对应是目录里的文件

//CLUSTER <--相对高级一点,你可以放在有精力的时候才去学习>

create table tab_ip_cluster(id int,name string,ip string,country string)

clustered by(id) into 3 buckets;   //根据id来分桶,分3桶

load data local inpath '/home/hadoop/ip.txt' overwrite into table tab_ip_cluster;


set hive.enforce.bucketing=true;


insert into table tab_ip_cluster select * from tab_ip;



select * from tab_ip_cluster tablesample(bucket 2 out of 3 on id);


  分桶是细粒度的,分桶是不同的文件

  分区是粗粒度的,即相当于,表下建立文件夹。分区是不同的文件夹

桶在对指定列进行哈希计算时,会根据哈希值切分数据,使每个桶对应一个文件。

  里面的id是哈希值,分过来的。

分桶,一般用作数据倾斜和数据抽样方面。由此,可看出是细粒度。

附PPT

hql语法及自定义函数(含array、map讲解) + hive的java api的更多相关文章

  1. 3 hql语法及自定义函数(含array、map讲解) + hive的java api

    本博文的主要内容如下: .hive的详细官方手册    .hive支持的数据类型   .Hive Shell .Hive工程所需依赖的jar包  .hive自定义函数 .分桶4   .附PPT hiv ...

  2. php函数基本语法之自定义函数

    PHP提供了功能强大的函数,但这远远满足不了需要,程序员可以根据需要自己创建函数.本节就开始学习创建函数的方法.大理石平台价格表 我们在实际开发过程当中需要有很多功能都需要反复使用到,而这些反复需要使 ...

  3. PHP基础函数、自定义函数以及数组

    2.10 星期五  我们已经真正开始学习PHP 了,今天的主要内容是php基础函数.自定义函数以及数组, 内容有点碎,但是对于初学者来说比较重要,下面是对今天所讲内容的整理:  1 php的基本语法和 ...

  4. hive -- 自定义函数和Transform

    hive -- 自定义函数和Transform UDF操作单行数据, UDAF:聚合函数,接受多行数据,并产生一个输出数据行 UDTF:操作单个数据 使用udf方法: 第一种: add jar xxx ...

  5. 三 Hive 数据处理 自定义函数UDF和Transform

    三  Hive 自定义函数UDF和Transform 开篇提示: 快速链接beeline的方式: ./beeline -u jdbc:hive2://hadoop1:10000 -n hadoop 1 ...

  6. MySQL学习——操作自定义函数

    MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...

  7. js array map() 函数的简单使用

    语法: array.map(function(currentValue,index,arr), thisValue) currentValue:必须.当前元素的值 index:可选.当前元素的索引值 ...

  8. jpa 联表查询 返回自定义对象 hql语法 原生sql 语法 1.11.9版本

    -----业务场景中经常涉及到联查,jpa的hql语法提供了内连接的查询方式(不支持复杂hql,比如left join ,right join).  上代码了 1.我们要联查房屋和房屋用户中间表,通过 ...

  9. 【转】Oracle 自定义函数语法与实例

    原文地址:https://blog.csdn.net/libertine1993/article/details/47264211 Oracle自定义函数的语法如下: create or replac ...

随机推荐

  1. 前端编程提高之旅(五)----写给大家看的css书

       自实习也有几个月的时间了,以爱奇艺实习为敲门砖.进入了眼下这家公司.假设说当初能进爱奇艺是暂时袭击DIV+CSS的话,眼下在这家公司体验到.不论什么技术都必须悉知原理,这样才干做到庖丁解牛.做一 ...

  2. mac系统不同java版本切换

    #确认jdk版本 /usr/libexec/java_home #会得到下面信息(不同版本显示不一样) /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jd ...

  3. liberOJ #6173. Samjia 和矩阵 hash+后缀数组

    #6173. Samjia 和矩阵 题目链接  : 点这里 题目描述 给你一个只包含大写字母的矩阵,求有多少本质不同的子矩阵. 输入格式 第一行包含两个整数 nnn , mmm ,表示矩阵 nnn 行 ...

  4. ul li menu

    第一步:建立一个无序列表我们先建立一个无序列表,来建立菜单的结构.代码是: <ul><li><a href="1">首页</a>&l ...

  5. Delphi之萝莉调教篇

    本文纯属技术交流.如果各位看官想与小生一起探讨萝莉的问题的话...PM我吧 关于Delphi的萝莉调教技术,很久以前就有大牛做过了...其实技术早掌握了只是觉得太无聊~估计大家也都会于是就没有写~既然 ...

  6. lc.exe 已退出 代码为 -1

    地址:http://jingyan.baidu.com/article/91f5db1bd0ace31c7f05e321.html

  7. 用Delphi7 调用.NET 2.0的WebService 所要注意的问题(Document格式和UTF8编码)

    Delphi7 调用VS.NET 2005开发的基于.NET 2.0的WebService时发生了错误.查阅资料 http://www.community.borland.com/article/bo ...

  8. 用secureCRT ssh登陆不显示用户名和路径解决方案 分类: 软件工具学习 2015-03-18 16:52 36人阅读 评论(0) 收藏

    方法1         每次开始的时候输入 bash 虽然只能保存一次,但是简便. 方法2 用       vi ~/.bash_profile   编辑这个文件,  有时会提示这个文件不存在,直 ...

  9. webpack 的编译原理

    自从接触了react,vue 这两个框架,都会用到webpack这个打包工具.面试的时候,经常被问到知道webpack的编译原理吗? 可以简单的介绍一下.每每这个时候都被问的哑口无言,平时用的时候挺顺 ...

  10. linux内核的三种主要调度策略

    linux内核的三种主要调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务 3,SCHED_RR实时调度策略,时间片轮转 实时进程将得到优先调用, ...