Hive改表结构的两个坑|避坑指南
Hive在大数据中可能是数据工程师使用的最多的组件,常见的数据仓库一般都是基于Hive搭建的,在使用Hive时候,遇到了两个奇怪的现象,今天给大家聊一下,以后遇到此类问题知道如何避坑!
坑一:改变字段类型后更新数据不成功
关于hive插入数据的一个小坑,今天插入一个表中数据,插入时写的是常数,比如0.01 ,表中的字段也是DECIMAL(5,2),按照常理插入的应该是0.01,但是插入后查询是0,为甚!

遇到问题,咱也不能退缩!就分析呀,看语句没问题啊!还是上网查查有没有坑友。查了一圈发现还是观望最靠谱!上hive官网查,呀~ 发现了原因!
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-Decimals
根据官网描述,发现在插入分区表时会出现这种情况,此时需要对之前的分区处理下~:
那就测试一下 按照官网的说法:
先建表:
CREATE TABLE `tb_dw_test`(
`a` int COMMENT '微信服务量')
PARTITIONED BY (
`statis_date` varchar(8))
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|' ;
然后插入数据:
insert overwrite table tb_dw_test partition (statis_date=20160501) values(1.02);
然后查询:
hive> select * from tb_dw_test;
OK
1 20160501
发现结果跟想象中的一样~
然后修改表字段:
ALTER TABLE tb_dw_test REPLACE COLUMNS (a DECIMAL(5,2))
然后再次插入数据:
insert overwrite table tb_dw_test partition (statis_date=20160501) values(1.02);
查询:
hive> select * from tb_dw_test;
OK
1 20160501
发现有问题啦!

那么按照官网处理:
Determine what precision/scale you would like to set for the decimal column in the table. For each decimal column in the table, update the column definition to the desired precision/scale using the ALTER TABLE command:
ALTER TABLE foo CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);
If the table is a partitioned table, then find the list of partitions for the table:If the table is not a partitioned table, then you are done. If the table has partitions, then go on to step 3
SHOW PARTITIONS foo;
ds=2008-04-08/hr=11
ds=2008-04-08/hr=12
...
This can be done with a single ALTER TABLE CHANGE COLUMN by using dynamic partitioning (available for ALTER TABLE CHANGE COLUMN in Hive 0.14 or later, with HIVE-8411):Each existing partition in the table must also have its DECIMAL column changed to add the desired precision/scale.
SET hive.exec.dynamic.partition = true;-- hive.exec.dynamic.partition needs to be set to true to enable dynamic partitioning with ALTER PARTITION-- This will alter all existing partitions of the table - be sure you know what you are doing!ALTER TABLE foo PARTITION (ds, hr) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);
所以参照官网,这里对表作如下处理:
ALTER TABLE tb_dw_test PARTITION (statis_date) CHANGE COLUMN a a DECIMAL(5,2);
再次插入数据:
insert overwrite table tb_dw_test partition (statis_date=20160501) values(1.02);
然后查询:
hive> select * from tb_dw_test;
OK
1.02 20160501
Time taken: 0.066 seconds, Fetched: 1 row(s)
发现结果跟想象中的一样了。这个坑算是过去了~
坑二:增加字段后更新数据不成功
还是上面的例子那张表,再增加一个字段:
alter table tb_dw_test add COLUMNS (b varchar(5))
然后查询
hive> select * from tb_dw_test;
OK
1.02 NULL 20160501
Time taken: 0.082 seconds, Fetched: 1 row(s)
发现新增的字段默认的值是NULL,现在我重新覆盖一下元数据,给增加的字段一个值:
insert overwrite table tb_dw_test partition(statis_date=20160501) values (2.01,0371);
然后查询:
hive> select * from tb_dw_test;
OK
2.01 NULL 20160501

不是我们想象的结果,查看一下官方文档说明发现了问题的所在:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Add/ReplaceColumns

靠谱的官网用红色框框提示我们!那就这样处理:
alter table tb_dw_test replace COLUMNS (a decimal(5,2),b varchar(5)) CASCADE;
直接查询,发现数据显示的数据已经发生了变化了~
hive> select * from tb_dw_etst;
OK
2.01 0371 20160501
避坑指南
综上发现,我们是按照Oracle这样的标准在考虑HiveSQL,但是通过阅读官方文档发现二者之间还是有很大不同的,底层原理差别还是有点大!通过这两次踩坑发现,仔细阅读官方文档的重要性!!!
所以,以后大家遇到大数据开源组件的报错问题,第一就是去找官方文档,然后就去找社区,总能发现惊喜!
Hive改表结构的两个坑|避坑指南的更多相关文章
- mysql大数据表改表结构方案
有一个表有上千W数据, 用什么方法给这个表加一个字段最快?1. alert2. 建一个表和第一个表一样,只是多了要加的字段,然后用多个INSERT INTO SELECT语句limit写入3. 就是导 ...
- MySQL和hive对比表结构脚本
#!/bin/bash source /etc/profile runlog='/tmp/zewei/check_schema_log' hive_database_schema=/tmp/hive_ ...
- 读取hive的表结构,生成带comment的视图建表语句
### 读取hive的表结构,生成带comment的视图建表语句 # 读取配置文件中的表并进行遍历 grep -v '^#' tablesFile|while read tableName do st ...
- mysql在线改表结构 pt-online-schema-change
https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html 不锁表更改数据库表结构 pt-online-s ...
- hive 查看表结构和属性
1.查看数据库/表 show databases/tables; 2.切换数据库 use database_name; 3.查看表结构 desc table_name; 4.查看表详细属性 desc ...
- HBase-修改表结构
HBase修改表结构 package com.hbase.HBaseAdmin; import java.io.IOException; import org.apache.hadoop.conf.C ...
- 007-Hadoop Hive sql语法详解2-修改表结构
一.表 更改表名:ALTER TABLE table_name RENAME TO new_table_name 增加表的元数据信息:ALTER TABLE table_name SET TBLPRO ...
- Hive 修改表结构常用操作
添加列 add columns alter table table_name add columns (id int comment '主键ID' ) ; 默认在表所有字段之后,分区字段之前. 替换 ...
- Hive metastore表结构设计分析
今天总结下,Hive metastore的结构设计.什么是metadata呢,对于它的描述,可以理解为数据的数据,主要是描述数据的属性的信息.它是用来支持如存储位置.历史数据.资源查找.文件记录等功能 ...
随机推荐
- 寻找猴王小游戏php代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Spring Boot 集成 Memcached
Memcached 介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站 ...
- JavaScript 的诞生
JavaScript的历史 网景 1993年出现网页浏览器NCSA Mosaic 1994年出现Netscape Navigator,并占据四分之三浏览器市场 1995年5月布兰登根据公司的要求发明一 ...
- CentOS基础操作
一.修改IP地址 vim ../etc/sysconfig/network-scripts/ifcfg-ens33 在文件中修改或添加以下内容 TYPE=Ethernet PROXY_METHOD= ...
- P1227 【[JSOI2008]完美的对称】
这道题,先讲一下我的做题思路 这道题的最主要的目的就是算出中心,我下面称为中点.这个中点其实很好算的,我们只需要算出最左下角的坐标和最右上角的坐标,然后用中点坐标公式算出来就ok了,那么这道题就做完了 ...
- VS Code安装yo(Yeoman) 插件下载.net core 模版代码开发
在安装插件以前,请看插件地址的相关依赖 Pre-requirements [Node.js] (https://nodejs.org) [npm] (https://www.npmjs.com) [Y ...
- Vue最全知识点
声明:本篇文章纯属笔记性文章,非整体原创,是对vue知识的整理, 基础篇 说说你对MVVM的理解 Model-View-ViewModel的缩写,Model代表数据模型,View代表UI组件,View ...
- SQL语句中IF的简单使用 - 关联leetcode 627.交换工资
MySQL的IF既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: IF表达式 IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 & ...
- 超简单集成华为HMS ML Kit文本识别SDK,一键实现账单号自动录入
前言 在之前的文章<超简单集成华为HMS Core MLKit通用卡证识别SDK,一键实现各种卡绑定>中我们给大家介绍了华为HMS ML Kit通用卡证识别技术是如何通过拍照自动识别卡 ...
- Labview学习之路(二)截屏时弹出来的窗口总是关闭
当屏幕上存在一些弹出来的窗口时,总是会出现一按下截图快捷键那些窗口就关闭的情况,开始我也很苦恼,后来我发现,只要按顺序按下 Ctrl Alt A 就可以让那些窗口不关闭,记住一定 ...