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

如何用数字 取hive表某列值

发布网友 发布时间:2022-04-21 19:55

我来回答

1个回答

热心网友 时间:2022-04-13 16:03

  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
父母离异的话,会不会导致孩子心智不成熟? 过节 公司给我们发的购物卡 这个怎么做分录 属于福利费吗 需要计提吗... 乡村振兴公务员和省考公务员有什么区别 ...小时候跟着爷爷学国画书法,小受家是农村的,小受姓夏或叶,他带着他... 瑞麒X1安全装置 瑞麒X1的舒适型和豪华型有什么区别?配置有哪些不同的地方?这5000块多在... 瑞麒X1的安全性能方面配置如何? 脚崴了 有大量於血 怎么样才能快速消肿 脚崴了外侧出现瘀血浮肿怎么消除? ...换了我喜欢的发型,但是穿了件有点透明的衣服,可以看到肩_百度... hive on spark overwrite 空表不覆盖 hive查询结果导入hadoop文件系统如何修改分隔符?i... hive insert overwrite table 执行报错 执行insert overwrite local directory 文件被覆盖... insert overwrite table record是什么意思 insert overwrite 删除哪些数据 酸奶可以加热吗? 袋装酸奶常温能放几天 盒装常温酸奶可以直接在微波炉内加温吗? 常温酸奶可以加热吗,常温酸奶冬天能加热吗 常温酸奶可以加热吗 瓶装酸奶可以加热喝吗 带包装的酸奶能直接在微波炉里加热么? 安慕希酸奶能不能连着塑料盒一起放在热水里加热? 常温酸奶可以加热吃吗 一般火腿怎样做好好吃,简单几种做法? 烤箱烤生粗肉粒火腿怎么控制 火腿肠怎么做好吃,孜然火腿肠的家常做法 如何把火腿块成菱形 Huawei Pay有必要使用吗,比支付宝还好吗 hive0.7.0中,执行 INSERT OVERWRITE TABLE hbase_... hive的Hive常用优化方法 为什么跑hive hadoop出现很多临时文件 eclipse选中文字输入新内容后,原来的内容会后移,没... hive分隔符支持多个字符吗 如何用sql对maxcompute数据进行修改和删除 hive查询时间复杂度 贪婪洞窟加点怎么选 贪婪洞窟哪种加点更好 hive insert into 插入数据后表中原来的数据丢失了 如何用Hive 往HBase里面插入大量的数据 贪婪洞窟新手玩家怎么加点 属性加点优 keil敲空格键的时候后面的文字也跟着消失了,该怎么... 贪婪洞窟前期怎么加点 空格键变成删除键怎么回事 贪婪洞窟技能加点顺序推荐 hive 为什么不能退格 贪婪洞窟哪个流派好用 贪婪洞窟全流派配装及加点攻略 猪肚猪肠怎么洗才干净 贪婪洞窟新版本角色加点攻略 新手怎么加点 猪大肠、猪肚、猪心,怎么清洗才没有异味?