hive表新增字段,指定新增字段位置,删除字段

这篇具有很好参考价值的文章主要介绍了hive表新增字段,指定新增字段位置,删除字段。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:项目中,客户使用hive内表,由于逻辑变更,原hive表结构需要调整,新增字段。

一、新增字段

遇到hive表新增字段,以往建表都是建外表,直接drop后,重新创建。由于这次全部使用内表创建的,所以使用add column功能新增字段。

alter table database.table_name add columns(col_type string comment '类型');

但是发现,如果已经存在记录的情况下覆盖写入,新添加的字段任然为NUll。如果是新的记录,则可以写入。

注意:如果创建的是分区表,则在添加新字段时,必须要带上cascade,否则该字段无法进入数据。

根本原因是元数据中带分区表的元数据和hive的实际存储不一致。

alter table database.table_name add columns(col_type string comment '类型') cascade;

如果已经添加了字段,可以修改字段时,在修改字段名时带上,在修改回来。如下:

alter table database.table_name change col_type col_type1 string comment '类型' cascade;
alter table database.table_name change col_type1 col_type string comment '类型' cascade;

或者使用如下sql修复

msck repair table database.table_name; 

总结:

对Hive表新增字段时,官方给出的语法结构如下:

ALTER TABLE table_name
  [PARTITION partition_spec]
  ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  [CASCADE|RESTRICT]

其中CASCADE选项为选填的字段,但是对于分区表,一定要加上,否则其历史分区的元数据信息(metadata)将无法正常更新,导致访问历史分区时会报莫名的错误 
cascade的中文翻译为“级联”,也就是不仅变更新分区的表结构(metadata),同时也变更旧分区的表结构。  

二、调整字段顺序

注意:新增字段,默认添加在字段最后,分区字段之前。

1、hive表中指定位置增加一个字段,分两步:

第一步:先添加字段到最后(add columns);

第二步:然后再移动到指定位置(change)

alter table 表名 add columns (列名 string comment '注释'); 
alter table 表名 change 要移动的列名 移动后的列名 string after 指定位置的列名;

经验证,hive中修改字段顺序并没有将字段对应的值移动,只是单纯的修改字段名,如果是空表(没有数据),可以使用以上两步;如果表中已经有数据了不推荐这么做,如果想增加字段只能往最后一个字段后添加字段。

谨记!!!

2、如果已经将列名修改了,该怎么复原呢?其实很简单,将新增字段移动原始表的最后一个字段

alter table tmpdb.change_column_test  change e e int after d;

三、删除字段

Hive不能直接删除列,不然底层系列化就乱了,我们可以通过replace语句来替换整张表的字段,达到同样的效果。

实际上,使用alter语句,把保留的字段全部列出来,删除的字段不要列出来。

例如:表tmpdb.del_col_test分区字段

 date_month STRING, 
 date_day STRING, 
 org_code STRING

结构:

  cost_ex_wl_f DECIMAL(38,18),
  cost_ex_bd_f DECIMAL(38,18),
  cost_ex_wx_f DECIMAL(38,18),
  cost_ex_km_f DECIMAL(38,18),
  cost_ex_jt_f DECIMAL(38,18),
  cost_ex_qt_f DECIMAL(38,18),
  cost_ex_jj_f DECIMAL(38,18),
  cost_ex_zj_f DECIMAL(38,18),
  cost_ex_gd_f DECIMAL(38,18),
  cost_ex_ww_f DECIMAL(38,18),
  cost_ex_cl_f DECIMAL(38,18)

假如,要删除字段 cost_ex_ww_f,  cost_ex_cl_f ,删除字段sql如下:

alter table tmpdb.del_col_test replace columns(
  cost_ex_wl_f DECIMAL(38,18),
  cost_ex_bd_f DECIMAL(38,18),
  cost_ex_wx_f DECIMAL(38,18),
  cost_ex_km_f DECIMAL(38,18),
  cost_ex_jt_f DECIMAL(38,18),
  cost_ex_qt_f DECIMAL(38,18),
  cost_ex_jj_f DECIMAL(38,18),
  cost_ex_zj_f DECIMAL(38,18),
  cost_ex_gd_f DECIMAL(38,18)
--注意:分区表,不用写分区字段
);

语句中只写想要保留的字段就可以。 

更多内容,请查看:Hive分区表新增字段及修改表名,列名,列注释,表注释,增加列,调整列顺序,属性名等操作文章来源地址https://www.toymoban.com/news/detail-487973.html

到了这里,关于hive表新增字段,指定新增字段位置,删除字段的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES 旧表新增字段与删除字段

    注: ES新建库就是所谓的新建索引。一个索引不要采用删除后重建数据迁移的方法,数据量太大,会有服务中断时间。 在我们进行ES索引mapping结果修改后,已有数据是并没有改新增字段的 只有在查询新字段时,系统会根据新字段类型自动返回默认值或者空值

    2024年02月15日
    浏览(39)
  • Hive 分区表新增字段 cascade

    在以前上线的分区表中新加一个字段,并且要求添加到指定的位置列。 加 cascade 操作 创建测试表 插入测试数据 查看现有数据 官网添加列的语法 注意: Hive 1.1.0 中有 CASCADE|RESTRICT 子句。 ALTER TABLE ADD|REPLACE COLUMNS CASCADE 命令修改表元数据的列,并将相同的更改级联到所有分区

    2024年02月11日
    浏览(54)
  • elasticsearch删除脏数据(根据指定字段删除数据)

    es中出现几条脏数据,现在要把这几条数据直接删掉 找到要删除的脏数据,一般是根据id之类的字段来删除,因为id具有唯一性,其实和mysql差不多 1、先查到该条记录(注意我们这边使用的是 ticketId字段,因为他具有唯一性,方便查询) 返回结果 2、接下来就把 ticketId 为 fd

    2024年02月16日
    浏览(35)
  • 请问如何用oracle触发器实现不允许新增/删除表/增加/减少/修改字段类型

    请问如何用oracle触发器实现不允许新增/删除表/增加/减少/修改字段类型 给本帖投票 56211打赏收藏  分享  转发到动态举报  写回复 性能测试中发现oracle11g数据库每天22点,oralce进程CPU占用率突增 11 条回复  切换为时间正序 请发表友善的回复… 发表回复 microsoft_fly 2008-11-18 还

    2024年02月16日
    浏览(47)
  • umy-ui —— table检索字段自动滚到指定位置并高亮

    需求:  通过input输入框,输入要查找的数据字段,点击确定可以定位到查找的那行数据、并把改行显示高亮。   实现思路: 安装 umy-ui 和 babel插件:(el-table可直接忽略不安装) main.js中引入: babel.config.js中添加: vue代码实现:    首先: u-table中必须添加的属性: 1. use

    2024年02月12日
    浏览(34)
  • mybatis-plus 根据指定字段 批量 删除/修改

    mybatis-plus 提供了根据id批量更新和修改的方法,这个大家都不陌生 但是当表没有id的时候怎么办) 这个就不说了,就是因为不想手写SQL 所以才有这篇博客 mybatis plus 的 executeBatch 参考 mybatis plus 的updateBatchById 方法. 调用处: 接口 重写方法 实现 这种写法其实批量的效率还是比较慢的

    2024年02月13日
    浏览(39)
  • Java中ArrayList如何删除指定位置的元素

    目标:list中有0到39共40个元素,删除其中索引是10、20、30的元素 首先当我们删除第10位元素时,List会将后面的元素向前补位,之后再查第10位元素就会输出第11位元素 那么删除了一个元素以后,后面需要删除的元素位置就向前提1位 当然我们可以用一个数组或列表从小到大存

    2023年04月08日
    浏览(78)
  • `accept` 是一个 HTTP 请求头字段,用于指定客户端可接受的内容类型

    accept 是一个 HTTP 请求头字段,用于指定客户端可接受的内容类型。在 JavaScript 中,可以使用 fetch API 发送带有 Accept 头的请求。例如: 续写 当然可以,以下是一些关于 accept 请求头的更多信息: 使用不同的内容类型 除了 application/json ,你还可以使用其他内容类型来指定客户

    2024年02月22日
    浏览(40)
  • Java语言创建包含以上数据类型的MySQL表,并提供批量新增数据、批量修改数据、删除数据以及字段的DDL语句的详细代码示例

    以下是使用Java语言创建包含以上数据类型的MySQL表,并提供批量新增数据、批量修改数据、删除数据以及字段的DDL语句的详细代码示例: 请注意,上述代码中的DB_URL、USER和PASS需要根据实际情况进行修改,以连接到正确的MySQL数据库。另外,需要确保已经导入了适当的JDBC驱动

    2024年02月15日
    浏览(76)
  • 【数据结构】单向链表的增删查改以及指定pos位置的插入删除

    目录  单向链表的概念及结构  尾插 头插 尾删 ​编辑  头删  查找  在pos位置前插  在pos位置后插  删除pos位置  删除pos的后一个位置 总结 代码  概念:链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的 指针链接 次序实现的

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包