Hive的insert语句能够从查询语句中获取数据,并同时将数据Load到目标表中。现在假定有一个已有数据的表staged_employees(雇员信息全量表),所属国家cnty和所属州st是该表的两个属性,我们做个试验将该表中的数据查询出来插入到另一个表employees中。

INSERT OVERWRITE TABLE employees

PARTITION (country = '中国', state = '北京')

SELECT * FROM staged_employees se

WHERE se.cnty = '中国' AND se.st = '北京';

由于使用了OVERWRITE关键字,目标表中原来相同partition中的所有数据被覆盖,如果目标表中没有partition,则整个表会被覆盖。

如果把OVERWRITE关键字删掉,或者替换成INTO,则hive会追加而不是替代原分区或原表中的数据,这个特性在Hive v0.8.0之后才支持。

当数据已经存在于hdfs上但不是我们想要的格式的时候,当进行的计算需要分好多步骤有必要存储中间数据的时候,或者原数据没有分区、有很多无效列需要过滤的时候,可以使用insert..select句型来完成这一转换过程。

由于一个国家有很多个省份,如果想根据(国家country,地区partition)两个维度对数据进行分区的话,这条SQL语句的执行个数应该等于地区的数目,比如中国有23个省就要对该SQL语句执行23次。因此hive对这个SQL语句进行了改造,只需要扫描一次原表就可以生成不同的输出(多路输出)。比如下面的SQL语句扫描了一次原始数据表,但是同时生成了3个省份的结果数据:

FROM staged_employees se

INSERT OVERWRITE TABLE employees

PARTITION (country = '中国', state = '河北省')

SELECT * WHERE se.cnty = '中国' AND se.st = '河北省'

INSERT OVERWRITE TABLE employees

PARTITION (country = '中国', state = '陕西省')

SELECT * WHERE se.cnty = '中国' AND se.st = '陕西省'

INSERT OVERWRITE TABLE employees

PARTITION (country = '中国', state = '河南省')

SELECT * WHERE se.cnty = 'US' AND se.st = '河南省';

通过缩进可以很清楚的看到,我们扫描了一次staged_employees表但是执行了3次不同的insert语句,这条大SQL语句是这么执行的:先通过from staged_employees表获取一条记录,然后执行每一个select子句,如果select子句验证通过则执行相应的insert语句。注意这里的三条select子句是完全独立执行的,并不是if .. then .. else的关系,这就意味着这3条select子句在某种情况下可能同时通过where检测。

通过这种结构,原始表的数据能被拆分到目标表的不同partition中去。

如果原表的一条记录满足于其中一个给定的select .. where .. 子句,则该记录将被写到目标表的固定分区中。其实更进一步,每条Insert语句能将数据写到不同的数据表中,不管这个表是否分区都一样。

于是,就像一个过滤器一样,原表的一些数据被写到了很多输出地址,而剩下的数据会被丢弃。

当然,你也可以混用Insert overwrite和insert into两种不同的方法写出数据。

向动态分区插入数据

但是问题还是没有解决,中国有23个省,那么我们就需要写23个insert into .. select ..where子句,这非常不现实。于是hive的一种叫做动态分区的特性就出现了,它能够根据select出来的参数自动推断将数据插入到那个分区中去。本文上面的两种SQL语句设定分区的方式都叫做静态分区插入。

将上一个SQL语句进行改动,会得到以下简洁的新SQL语句:

INSERT OVERWRITE TABLE employees

PARTITION (country, state)

SELECT ..., se.cnty, se.st

FROM staged_employees se;

hive先获取select的最后两个位置的se.cnty和se.st参数值,然后将这两个值填写到Insert语句partition中的两个country和state变量中,即动态分区是通过位置来对应分区值的。原始表select出来的值和输出partition的值的关系仅仅是通过位置来确定的,和名字并没有关系,比如这里se.cnty和county的名称完全没有关系。

上面的这条SQL语句是对两个分区同时进行了动态设定,如果staged_employees表中有100个国家,每个国家有100个地区,那么该SQL语句自动对每个国家和地区建立相应的partition并插入数据,如果用手写的话不现实。

只要位置正确,你可以混用动态分区和静态分区值设定,比如下面这个例子,你可以静态指定一个country值,但是state值采用动态的方法设定:

INSERT OVERWRITE TABLE employees

PARTITION (country = 'US', state)

SELECT ..., se.cnty, se.st

FROM staged_employees se

WHERE se.cnty = 'US';

注意:静态分区值必须在动态分区值的前面! 展开

展开完整答案

hive 如何将数组转成字符串_hive 一列数据作为字符串数组,怎么遍历相关推荐

  1. python画父子关系图_将有父子关系的一维数组转换成树形结构(多维)数据

    先来个函数注释 : /** * 将有父子关系的一维数组转换成树形结构(多维)数据 * console.log(JSON.stringify(setTreeData(data), null, 2)); ...

  2. mysql 父子维,将有父子关系的一维数组转换成树形结构(多维)数据

    拉莫斯之舞 先来个函数注释 :/** * 将有父子关系的一维数组转换成树形结构(多维)数据 * console.log(JSON.stringify(setTreeData(data), null,  ...

  3. printf函数中用到格式符%5s ,其中数字5表示输出的字符串占用5列。如果字符串长度小于5,则输出按方式。 A)从左起输出该字串,右补空格 B)按原字符长从左向右全部输出 C)右对齐输出该字串,左

    printf函数中用到格式符%5s ,其中数字5表示输出的字符串占用5列.如果字符串长度小于5,则输出按方式. A)从左起输出该字串,右补空格 B)按原字符长从左向右全部输出 C)右对齐输出该字串,左 ...

  4. Java 数组转成集合List三种方法和(数组、集合List、Set相互转换)

    Java 数组转成集合List 三种方法 package com.list;import java.util.ArrayList; import java.util.Arrays; import ja ...

  5. C#实战011:Excel操作-获取Excel某一列数据并存入数组

    操作Excel中的数据才是操作Excel的意义所在,不然前面忙活那么久就就没任何意义了,同样直接附上代码: using System; using System.Collections.Generic ...

  6. c语言二维数组赋值前面是行还是列,动态二维数组分配有问题啊 为什么行和列相同才能给数组赋值...

    #include #include void fun(char **p1,char *p2,int p,int q); int main() { int m,n,g,d,f; char **x; ch ...

  7. java数组-如何在一堆数据中使用数组!

    数组 1.类型一致的一组数据,其实相当于集合概念. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引来 ...

  8. Java面试会问的——数组、声明、初始化、冒泡、多维数组、稀疏数组

    数组 数组时相同类型数据的有序集合 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成 其中,每一个数据称作一个数组元素,每一个数组元素可以通过一个下标来访问它们. 数组声明创建 首先必 ...

  9. 【VBA研究】怎样将单元格数据赋给数组

    作者:iamlaosong 将工作表中的数据赋给数组或者将数组的数据赋给工作表,一般有两种.一种是循环的方法,一个一个的传,这样的方法一般用于须要对每一个数据特别处理的场合,还有一种是一次性用赋值语句 ...

最新文章

  1. 推荐系统笔记:基于矩阵分解(总结篇)
  2. 协方差意味着什么_“零”到底意味着什么?
  3. 缺少Python27_d.lib的解决方法
  4. Docker 三剑客之 Docker Compose
  5. 马来西亚 IT 决策者正转向开源来最大化 IT 功能
  6. history指令显示日期时间
  7. python写出租车计费系统_出租车计费系统设计 Java
  8. Eclipse配置使用SVN插件
  9. 在线IDE的原理及设计思路 以Java为例
  10. android实现自定义图标,Android开发中用Drawable 实现自定义电池图标
  11. 我如何把薪水从 50人民币/天 提升到 100美元/小时的 (3)
  12. 期货CTP接口C++源码与C#应用程序的对接
  13. 如何给批量的图片命名(以序号递增的形式)?
  14. 【老鸟进阶】deepfacelab如何让融合更自然(一)面具感篇
  15. linux怎么读(中文读音发音)
  16. 关于GR/IR—业务流程篇
  17. 陈平原:《阅读大学的六种方式》[转]
  18. w7计算机u盘在哪里,win7电脑无法发现u盘怎么解决
  19. 租车战场没有新故事,一嗨租车能否破局?
  20. Debian配置ssh服务

热门文章

  1. C++ 什么时候调用析构函数和构造函数
  2. Access的密码以及如何连接有数据库密码的 Access
  3. 浙江大学pat 1013
  4. 3_5.网络文件系统
  5. opencv-python DIS光流
  6. c++/qt/opencv实现魔方复原【娱乐】
  7. 温度控制器matlab,某温度控制系统的MATLAB仿真.doc
  8. 华钜同创:亚马逊运营新品广告运营的策略
  9. 求树的直径的两种方法
  10. IP查询和IPv6查询接口