`
WindyQin
  • 浏览: 32407 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

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_cu_mimsg_fbi_servdt_day1`(

`mimsg_serv` int COMMENT '微信服务量')

PARTITIONED BY (

`statis_date` varchar(8))

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '|' ;

 

然后插入数据:

insert overwrite table tb_dw_cu_mimsg_fbi_servdt_day1 partition (statis_date=20160501) values(1.02);

 

然后查询:

hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1;

OK

1 20160501

 

发现结果跟想象中的一样~

然后修改表字段:

ALTER TABLE tb_dw_cu_mimsg_fbi_servdt_day1 REPLACE COLUMNS (mimsg_serv DECIMAL(5,2))

 

然后再次插入数据:

insert overwrite table tb_dw_cu_mimsg_fbi_servdt_day1 partition (statis_date=20160501) values(1.02);

 

查询:

hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1;

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 theALTER TABLEcommand:

ALTERTABLEfoo CHANGECOLUMNdec_column_name dec_column_nameDECIMAL(38,18);

If the table is not a partitioned table, then you are done. If the table has partitions, then go on to step 3.

If the table is a partitioned table, then find the list of partitions for the table:

SHOW PARTITIONS foo;

 

ds=2008-04-08/hr=11

ds=2008-04-08/hr=12

...

Each existing partition in the table must also have its DECIMAL column changed to add the desired precision/scale.

This can be done with a singleALTER TABLE CHANGE COLUMNby using dynamic partitioning (available for ALTER TABLE CHANGE COLUMN in Hive 0.14 or later, withHIVE-8411):

SEThive.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!

ALTERTABLEfoo PARTITION (ds, hr) CHANGECOLUMNdec_column_name dec_column_nameDECIMAL(38,18);

 

这里对表作如下处理:

ALTER TABLE tb_dw_cu_mimsg_fbi_servdt_day1 PARTITION (statis_date) CHANGE COLUMN mimsg_serv mimsg_serv DECIMAL(5,2);

 

 

再次插入数据:

insert overwrite table tb_dw_cu_mimsg_fbi_servdt_day1 partition (statis_date=20160501) values(1.02);

 

然后查询:

hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1;

OK

1.02 20160501

Time taken: 0.066 seconds, Fetched: 1 row(s)

 

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

 

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

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

alter table tb_dw_cu_mimsg_fbi_servdt_day1 add COLUMNS (prov_code varchar(5))

 

然后查询

hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1;

OK

1.02 NULL 20160501

Time taken: 0.082 seconds, Fetched: 1 row(s)

 

发现新增的字段默认的值是NULL,现在我重新覆盖一下元数据,给增加的字段一个值:

insert overwrite table tb_dw_cu_mimsg_fbi_servdt_day1 partition(statis_date=20160501) values (2.01,0371);

 

然后查询:

hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1;

OK

2.01 NULL 20160501

发现还是NULL

不是我们想象的结果,查看一下官方文档说明发现了问题的所在:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Add/ReplaceColumns

ALTER TABLE ADD or REPLACE COLUMNS CASCADE will override the table partition's column metadata regardless of the table or partition's protection mode. Use with discretion.

 

那就这样处理:

alter table tb_dw_cu_mimsg_fbi_servdt_day1 replace COLUMNS (mimsg_serv decimal(5,2),prov_code varchar(5)) CASCADE;

 

直接查询,发现数据显示的数据已经发生了变化了~

hive> select * from tb_dw_cu_mimsg_fbi_servdt_day1;

OK

2.01 0371 20160501

 

综上发现,我们是按照Oracle这样的标准在考虑H-SQL,但是通过阅读官方文档发现二者之间还是有很大不同的,通过这次踩坑发现,仔细阅读官方文档的重要性!!!

分享到:
评论

相关推荐

    13-Hive基本操作1

    使用`ALTER TABLE`可以修改已存在的表结构,比如添加、删除或更改列。 6. **删除表**: `DROP TABLE`语句用于删除表。内部表的删除会同时移除数据和元数据,而外部表只移除元数据,数据保持不变。 7. **加载数据...

    龙战于野大数据MR原理启动hive查询表分区.docx

    MapReduce模型由两个阶段组成:Map和Reduce。Map阶段将输入数据分割成小块,并对每个小块进行处理;Reduce阶段将Map阶段的输出结果进行合并和聚合。 Hive查询表分区 在Hive中,表分区是指将一个大表分割成多个小表...

    spark操作hive表源码

    在大数据处理领域,Spark和Hive是两个非常重要的工具。Spark以其高效的计算性能和丰富的数据处理API,成为了大数据处理的首选框架,而Hive则以其SQL接口和对大规模数据仓库的支持,深受数据仓库和ETL工作的青睐。本...

    BLOG_如何将一个普通表转换为分区表.pdf

    Export/Import方法是最传统的转换策略,分为逻辑导出和逻辑导入两个阶段。首先在源数据库上创建好分区表的定义,然后使用数据导出工具将非分区表的数据导出到一个文件中。接着,在目标数据库上删除原非分区表,并将...

    hive-udf(两地址间距离计算+省市区位置解析(Java代码))

    在这个“hive-udf”项目中,我们主要探讨的是如何利用Java编写UDF来实现两个地址间的距离计算以及省市区位置的解析。 首先,地址转换成经纬度是计算距离的基础。地理坐标系统通常使用经度和纬度来定位地球上任意...

    Hive+表修改列名后内容为空的解决办法.doc

    ### Hive表修改列名后内容为空的问题及解决办法 #### 一、问题描述 在使用Hive进行数据处理时,可能会遇到需要修改表结构的情况,比如重命名某个字段(列)。然而,在某些情况下,特别是在使用Orc或Parquet这两种...

    hive分区表分通表建表语句详解和例子

    **二级静态分区表**则是在表中定义了两个或以上的分区字段,同样需要在加载数据时显式指定所有分区字段的值。 ```sql CREATE TABLE my_partitioner3 ( id BIGINT, name STRING, time DATE, interest ARRAY ) ...

    hive搭建及使用入门简介(内含PPT、各种表创建sql及hive搭建使用笔记)

    当进行JOIN操作时,如果两个表在JOIN键上使用了相同的分桶策略,Hive可以使用更高效的MapReduce算法,提升查询效率。 “各种表创建SQL”这部分将详细讲解CREATE TABLE语句的各种用法,包括创建基本表、分区表、分桶...

    hive入门级详解

    Hive 的存储结构主要包括内部表和外部表两种。内部表的数据由 Hive 自身管理,而外部表的数据由 HDFS 管理。内部表的元数据存储在关系型数据库中,而表数据存储在 HDFS 上。删除内部表会直接删除元数据和存储数据,...

    Hive大表的测试数据

    3. **Hive表的创建**:创建Hive表需要指定字段名、字段类型以及表的存储位置。例如: ```sql CREATE TABLE IF NOT EXISTS big_table (id INT, data STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ...

    部分普通sql查询在hive中的实现方式

    - **问题场景**:然而,当两个`COUNT(DISTINCT)`分别作用于不同的列时,Hive无法正确执行该查询,如: ```sql SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip) FROM pv_...

    hive所有jar文件

    一旦设置完成,Hive用户就能像操作普通Hive表一样操作HBase表了,这对于数据分析人员来说,极大地简化了操作流程,同时也利用了Hive的并行计算能力。 “hivelib”这个压缩包子文件的文件名称列表可能表示这个包包含...

    Hive使用手册Hive使用手册

    - 表连接允许合并来自两个或更多表的数据。 - 子查询在查询语句中嵌套另一个查询,用于筛选或聚合数据。 - UNION ALL用于合并多个SELECT结果集,不剔除重复行。 9. **Hive使用注意点** - 确保数据格式与表结构...

    Hive基本命令整理

    Hive 提供了多种方式来查看表信息,包括查看表结构信息、查看表中的分区信息、查看所有表等。例如,查看 logs 表中的分区信息: ``` hive> show partitions logs; ``` 查看所有表: ``` hive> SHOW TABLES; ``` 查看...

    hive学习必备经典(百度)

    Hive的元数据库用于存储Hive的元数据,如表结构、分区信息等。常用的元数据库管理系统包括DERBY和Mysql。其中,DERBY是一个嵌入式数据库管理系统,Mysql是一个常用的关系数据库管理系统。 Hive数据存储 Hive的数据...

    hive窗口函数

    其中,窗口函数是HiveQL的一个重要组成部分,它可以在不改变表结构的情况下,对数据进行复杂的数据处理与分析。本文主要介绍Hive中的窗口函数,特别是SUM、AVG、MIN、MAX等基础函数的应用场景及其具体用法。 #### ...

    Hive几种数据导入方式

    需要注意的是,在进行数据导入时,确保数据格式与表结构相匹配是非常重要的。此外,在从本地文件系统或 HDFS 导入数据时,还需关注文件编码、分隔符等问题,以避免数据解析错误。希望本文能对您在使用 Hive 进行数据...

    大数据 hive 实战数据

    在实际操作中,我们可能会使用Hive进行ETL(Extract, Transform, Load)过程,从原始数据中抽取、转换并加载到Hive表中。然后通过HQL进行数据探索、统计分析、报表生成等任务。此外,Hive还支持与其他大数据组件如...

    Hive用户指南 Hive user guide 中文版

    - **将数据插入到Hive表**:可以使用`INSERT INTO TABLE table_name [PARTITION (partition_spec)] SELECT ...`命令将数据从查询结果插入到Hive表中。 - **将查询结果写入文件系统**:通过`INSERT OVERWRITE ...

    hive&tez.zip

    Apache Hive和Tez是大数据处理领域中的两个重要组件,它们在Hadoop生态系统中扮演着关键角色。本篇文章将深入探讨这两个工具以及它们如何协同工作。 Hive是基于Hadoop的数据仓库工具,它允许用户通过SQL(称为HQL,...

Global site tag (gtag.js) - Google Analytics