问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用数字 取hive表某列值2

发布网友 发布时间:2024-02-21 13:02

我来回答

1个回答

热心网友 时间:2024-04-02 15:27

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';

  

  注意:静态分区值必须在动态分区值的前面!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我小弟要当兵,这几天在等家访,我想问一下需要拿钱之类的吗?_百度知 ... 怎样治好气管炎 怎么治好气管炎 气管炎能彻底治好吗 分手后再遇见前男友是什么感受? 分手后与前任再相遇 指弹怎么练 用吉他练指弹有什么快速入门的办法 皖西学院新生住哪里 皖西学院的宿舍条件好吗? hive中怎么删除表中的部分数据115 怎样把hive的一张表自动分割成多个表数据1 怀孕期间必须要做四维彩超吗?不做可以吗?求大神帮助 孕妇几个月照四维彩超好?求大神帮助 为什么列竖式的数要从个位算起呢? 为什么要从个位算起 误发垃圾短信后被举报了,怎么处理 邮政的是什么卡?有什么功能? 请问农业银行要多少存款 和钻石卡哪个高级 支付宝钻石会员和财富的区别 和钻石卡哪个高级 和钻石卡哪个高级 清洗油烟机都是洗哪里呢 孟子提出了什么和什么的文学批评方法 郑多燕小红帽操饭后跳?还是什么时候跳? 跳郑多燕操早上跳好还是晚上跳好 路遥的遗产多少亿 our后跟复数吗 离婚后孩子的抚养权如何确定 hive里如何提取最新分区的数据 向日葵的含义和象征意义 向日葵代表的意思 ...橡皮擦了,有一点痕迹,怎么样才能清楚的看到纸上的全部内容 太监的英文 周杰伦线上演唱会预约方式以及步骤 现在两万已上的电脑配置能配成什么样? 2万元左右的台式电脑现在能配个什么样子 具体的配置单给下3 现在台式电脑最高的配置,价钱能不能达到两万块以上 2W可以配个什么样的电脑? 你家买一台新电脑,花了多少钱呀? 我的这个电脑是AMDA8-5545M的CPU,8G内存,两G...4 我花600块换了个笔记本电脑键盘,贵了吧,大约是多少?3 我也不懂电脑 但是这在专营店买的电脑花了4200 一直到现在... 一个宽带连接两个路由器问什么网速这么慢,一个360路由器还一个是... 一个光猫,两个无线路由,怎样连接才可以平分网速不卡顿,我有交换机... 苹果IOS下载了大量喜马拉雅音频,占空间但不想删除又怎么能导出来呢?求... 伟大诗人当年出生的地方是京兆,有谁知道京兆现在是哪个省的?_百度知 ... 买了一台1万多的电脑算不算奢侈?7 关于1W2左右的电脑配置 (全套) 我是一名web程序员,工资1w2,在吧里什么水平1