Hive高级查询操作

根据已经存在的表,使用as关键字,创建一个与查询结果字段一致的表,同时将查询结果数据插入到新表

只有student_id,name两个字段的表

删除列,将继续存在的列再定义一遍,需要删除的列不再定义

字段名称类型注释分桶字段

student_idstring学生ID是

namestring姓名否

ageint年龄否

originstring学院ID否

查看hdfs分桶文件

说明:

分桶表一般不使用load向分桶表中导入数据,因为load导入数据只是将数据复制到表的数据存储目录下,hive并不会在load的时候对数据进行分析然后按照分桶字段分桶,load只会将一个文件全部导入到分桶表中,并没有分桶。一般采用insert从其他表向分桶表插入数据。 分桶表在创建表的时候只是定义表的模型,插入的时候需要做如下操作: 在每次执行分桶插入的时候在当前执行的session会话中要设置

声明本次执行的是一次分桶操作。需要指定reduce个数与分桶的数量相同

这样才能保证有多少桶就生成多少个文件。 如果定义了按照分桶字段排序,需要在从其他表查询数据过程中将数据按照分区字段排序之后插入各个桶中,分桶表并不会将各分桶中的数据排序。排序和分桶的字段相同的时候使用Cluster by(字段),cluster by 默认按照分桶字段在桶内升序排列,如果需要在桶内降序排列,使用distribute by (col) sort by (col desc)组合实现。

导出数据到本地的常用方法

默认结果分隔符:' '

创建2张表

导入数据

等同于

两个表通过id关联,把两个表的数据全部查询出来

左连接时,左表中出现的join字段都保留,右表没有连接上的都为空

右连接时,右表中出现的join字段都保留,左表没有连接上的都是空

左半连接实现了类似IN/EXISTS的查询语义,输出符合条件的左表内容。 hive不支持in …exists这种关系型数据库中的子查询结构,hive暂时不支持右半连接。 例如:

使用Hive对应于如下语句:

使用分布式缓存将小表数据加载都各个map任务中,在map端完成join,map任务输出后,不需要将数据拷贝到reducer阶段再进行join, 降低的数据在网络节点之间传输的开销。多表关联数据倾斜优化的一种手段。多表连接,如果只有一个表比较大,其他表都很小, 则join操作会转换成一个只包含map的Job。运行日志中会出现Number of reduce tasks is set to 0 since there's no reduce operator 没有reduce的提示。 例如:

创建用户评分表

导入数据

语法2:CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END 说明:如果a为TRUE,则返回b;如果c为TRUE,则返回d;否则返回e 例如:

查询用户评分表,每个年龄段的最大评分值

结果为:

当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。 UDF 作用于单个数据行,产生一个数据行作为输出。 步骤:

新建类继承UDF

将项目进行打包

说明:

如出现以下异常信息: Failed to execute goal on project hive-exec: Could not resolve dependencies for project org.apache.hive:hive-exec:jar:2.3.0: Could not find artifact org.pentaho:pentaho-aggdesigner-algorithm:jar:5.1.5-jhyde in alimaven (http://maven.aliyun.com/nexus/content/groups/public/) -> [Help 1]

请手动下载Jar包pentaho-aggdesigner-algorithm/5.1.5-jhyde.jar 下载地址:

将Jar包放置在本地Maven仓库org/pentaho/pentaho-aggdesigner-algorithm/5.1.5-jhyde路径下,之后进行重新打包。

创建临时函数与开发好的java class关联

在hql中使用自定义的函数

你可能感兴趣的:(Hive高级查询操作)