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;OK1                         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;OK1           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=11ds=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;OK1.02                20160501Time taken: 0.066 seconds, Fetched: 1 row(s)

发现结果跟想象中的一样了。这个坑算是过去了~

坑二:增加字段后更新数据不成功

还是上面的例子那张表,再增加一个字段:

alter table tb_dw_test add COLUMNS (b varchar(5))

然后查询

hive> select * from tb_dw_test;OK1.02    NULL    20160501Time 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;OK2.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;OK2.01    0371    20160501

避坑指南

官方文档!!官方文档!!官方文档!!

综上发现,我们是按照Oracle这样的标准在考虑HiveSQL,但是通过阅读官方文档发现二者之间还是有很大不同的,底层原理差别还是有点大!通过这两次踩坑发现,仔细阅读官方文档的重要性!!!

所以,以后大家遇到大数据开源组件的报错问题,第一就是去找官方文档,然后就去找社区,总能发现惊喜!

历史好文推荐

  1. 数据挖掘(一):线性回归和逻辑回归

  2. 数据挖掘(二):决策树

  3. 数据挖掘(三):朴素贝叶斯

  4. 数据挖掘(四):手撕(绘)关联规则挖掘算法

  5. 数据挖掘(五)seaborn 的数据可视化

  6. 数据挖掘(六):K-means 聚类

  7. 数据挖掘(七):TensorFlow和keras实现线性回归LinearRegression

hive 增加表字段语录_Hive改表结构的两个坑|避坑指南相关推荐

  1. oracle表字段获取,获取oracle表结构的字段信息

    获取oracle表结构的字段信息 select a.column_id as 列号, a.column_name as 列名, a.data_type as 类型, decode(a.data_typ ...

  2. sqlserver增加表字段 给report_smart这个表增加a50 a51 a52‘‘‘‘ a59几个字段

    declare @i int; declare @a varchar(10); set @i =50; while(@i<60) begin set @a = 'a'+cast(@i as va ...

  3. hive改表结构的两个坑

    坑一:改变字段类型后更新数据不成功   关于Hive插入数据的一个小坑,今天插入一个表中数据,插入时写的是常数,比如0.01 ,表中的字段也是DECIMAL(5,2) 按照常理插入的应该是0.01,但 ...

  4. oralce 增加表字段命令|oralce 增加表字段类型命令

    oralce 增加表字段命令 语法 alter table 表明 add 字段名 类型 alter table aqcuser add email varchar(36) 转载于:https://ww ...

  5. hadoop元数据mysql中表字段_Hive 元数据表结构详解

    元数据是基础,这篇文章值得一读. 本文介绍Hive元数据库中一些重要的表结构及用途,方便Impala.SparkSQL.Hive等组件访问元数据库的理解. 1.存储Hive版本的元数据表(VERSIO ...

  6. 数据库表(字段类型、约束、截断表、修改表字段、重命名表)

    字段类型: 在这里只列举一些常用的字段类型: 整数类型:int(Integer):普通大小的整数 小数类型: float(m,d):单精度浮点数,m表示数字长度,d表示小数位数,例如float(5,2 ...

  7. hive load data inpath 空目录_Hive内部表 | 每日五分钟学大数据

    上一篇说的是外部表,当把EXTERNAL关键字去掉的时候就是内部表了.为什么叫内部表,因为这种表,Hive会(或多或少地)控制着数据的生命周期. 如果你熟悉Hive那你一定知道,Hive默认情况下会将 ...

  8. oracle 建表字段设置,Oracle创建表、删除表、修改表(添加字段、修改字段、删除字段)语句总结...

    关于Oracle创建表.删除表.修改表(添加字段.修改字段.删除字段)语句的简短总结. Oracle创建表: create table 表名 ( 字段名1 字段类型 默认值 是否为空 , 字段名2 字 ...

  9. oracle修改表字段约束条件,Oracle创建表、修改表、删除表、约束条件语法

    三.删除表 truncate table 表名 //删除表中的所有数据,速度比delete快很多,截断表 delete from table 条件   // 删除表中的数据 drop table 表名 ...

最新文章

  1. mysql的natural join_MySQL基础之Natural Join用法
  2. 置信区间估计 预测区间估计_估计,预测和预测
  3. 轻量化网络MobileNet解析
  4. 操作系统—多生产者多消费者问题
  5. “迷失自我”,请记住下面5个网站,让你受益终身
  6. 安装ie9提示未能完成安装_ie11/ie10/ie9安装程序无法验证安装文件
  7. 今天开始写博客记录程序媛成长过程
  8. 图像处理在医学方面的应用
  9. java方法的通用格式,【学习笔记】使用Java读取、写入Excel全版本(包含xls、xslx格式)通用方法及代码展示(POI)...
  10. mysql动态ip域名连接_用本地动态IP连接本地mysql
  11. linux intel wifi驱动,ubuntu 8.04下面 Intel WIFI link 5100无线网卡驱动安装
  12. RuntimeWarning: Mean of empty slice
  13. python自动化运维:python环境的安装
  14. rman怎么恢复数据文件
  15. Red Hat Enterprise Linux Server 7.4 安装方法
  16. HttpClient 实现 socks 代理
  17. 计算几何-求球冠体积
  18. 华为三层交换机 配置
  19. Qt 绝对要收藏的网站QTCN Qt绘图工具
  20. 工业防火墙架构与技术【第一节:概述】

热门文章

  1. Python花式编程案例集锦(8):判断吉祥数字
  2. 在python中设置密码登录_在python中生成密码
  3. C++ 你想要的C++面经都在这(附答案 | 持续更新)
  4. 我们用计算机做什么大餐英语怎么说,感恩用英语怎么说
  5. 华为鸿蒙系统英语报纸_华为鸿蒙英文不是Hongmeng OS?余承东解释
  6. kettlejava脚本的api_[翻译]KETTLE JAVA API :编程定制自己的Kettle转换(transformation)...
  7. java digests.generatesalt_Java DigestUtils.sha1Hex方法代碼示例
  8. C++之new和delete探究
  9. python alter_GitHub - sealter/LearnPython: 以撸代码的形式学习Python
  10. git安装 tor_Tortoisegit图文使用教程