中易网

如何用数字 取hive表某列值

答案:2  悬赏:0  
解决时间 2021-02-22 12:59
如何用数字 取hive表某列值
最佳答案
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';



  注意:静态分区值必须在动态分区值的前面!
全部回答
没看懂什么意思?
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
新疆油建公司停车场地址有知道的么?有点事想
我家腊肠狗吃屎怎么办?
坐北京地铁6号线到那下站下车后就能到上684路
小缸养龙凤锦鲤能长多大
呼吁的反义词是什么
兰龙餐馆这个地址在什么地方,我要处理点事
冠捷AOC2450 2450w 这个显示器是23.4英寸,长
真的吗 日语怎么
求教,突然充不进去电,然后掉电特别快
马家羊肉泡麦积店地址在什么地方,想过去办事
七二年生多少岁
寻仙乾坤80级法宝怎么弄,可以买吗
请问科目二倒车入库,左倒库总是压右边线是为
有什么能去除痘坑的方法吗?不要做手术的 最
集安市总工会我想知道这个在什么地方
推荐资讯
长春农业博览园17号门我想知道这个在什么地方
canon数码相机摔坏了
王者荣耀过几天要出新英雄庞统吗
右图ABCD是直角梯形,以AB为轴并将梯形绕这个
暴风影音手机屏关掉为什么不能缓存
中国邮政邮政便利店在哪里啊,我有事要去这个
我的工伤已结案,工伤陪付的钱也到位,为什么
自行车件地址在什么地方,想过去办事
问一下,努比亚Z11miniS长按电源键12秒重启伤
用什么词语来形客乌鸦这种孝敬的行为
QQ安全中心为您拦截异常1次,您的帐号疑似被
南阳市艾和堂天然艾草生物制品开发有限公司我
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?