坑一:改变字段类型后更新数据不成功
关于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:
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:
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):
|
这里对表作如下处理:
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
不是我们想象的结果,查看一下官方文档说明发现了问题的所在:
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,但是通过阅读官方文档发现二者之间还是有很大不同的,通过这次踩坑发现,仔细阅读官方文档的重要性!!!
相关推荐
使用`ALTER TABLE`可以修改已存在的表结构,比如添加、删除或更改列。 6. **删除表**: `DROP TABLE`语句用于删除表。内部表的删除会同时移除数据和元数据,而外部表只移除元数据,数据保持不变。 7. **加载数据...
MapReduce模型由两个阶段组成:Map和Reduce。Map阶段将输入数据分割成小块,并对每个小块进行处理;Reduce阶段将Map阶段的输出结果进行合并和聚合。 Hive查询表分区 在Hive中,表分区是指将一个大表分割成多个小表...
在大数据处理领域,Spark和Hive是两个非常重要的工具。Spark以其高效的计算性能和丰富的数据处理API,成为了大数据处理的首选框架,而Hive则以其SQL接口和对大规模数据仓库的支持,深受数据仓库和ETL工作的青睐。本...
Export/Import方法是最传统的转换策略,分为逻辑导出和逻辑导入两个阶段。首先在源数据库上创建好分区表的定义,然后使用数据导出工具将非分区表的数据导出到一个文件中。接着,在目标数据库上删除原非分区表,并将...
在这个“hive-udf”项目中,我们主要探讨的是如何利用Java编写UDF来实现两个地址间的距离计算以及省市区位置的解析。 首先,地址转换成经纬度是计算距离的基础。地理坐标系统通常使用经度和纬度来定位地球上任意...
### Hive表修改列名后内容为空的问题及解决办法 #### 一、问题描述 在使用Hive进行数据处理时,可能会遇到需要修改表结构的情况,比如重命名某个字段(列)。然而,在某些情况下,特别是在使用Orc或Parquet这两种...
**二级静态分区表**则是在表中定义了两个或以上的分区字段,同样需要在加载数据时显式指定所有分区字段的值。 ```sql CREATE TABLE my_partitioner3 ( id BIGINT, name STRING, time DATE, interest ARRAY ) ...
当进行JOIN操作时,如果两个表在JOIN键上使用了相同的分桶策略,Hive可以使用更高效的MapReduce算法,提升查询效率。 “各种表创建SQL”这部分将详细讲解CREATE TABLE语句的各种用法,包括创建基本表、分区表、分桶...
Hive 的存储结构主要包括内部表和外部表两种。内部表的数据由 Hive 自身管理,而外部表的数据由 HDFS 管理。内部表的元数据存储在关系型数据库中,而表数据存储在 HDFS 上。删除内部表会直接删除元数据和存储数据,...
3. **Hive表的创建**:创建Hive表需要指定字段名、字段类型以及表的存储位置。例如: ```sql CREATE TABLE IF NOT EXISTS big_table (id INT, data STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ...
- **问题场景**:然而,当两个`COUNT(DISTINCT)`分别作用于不同的列时,Hive无法正确执行该查询,如: ```sql SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip) FROM pv_...
一旦设置完成,Hive用户就能像操作普通Hive表一样操作HBase表了,这对于数据分析人员来说,极大地简化了操作流程,同时也利用了Hive的并行计算能力。 “hivelib”这个压缩包子文件的文件名称列表可能表示这个包包含...
- 表连接允许合并来自两个或更多表的数据。 - 子查询在查询语句中嵌套另一个查询,用于筛选或聚合数据。 - UNION ALL用于合并多个SELECT结果集,不剔除重复行。 9. **Hive使用注意点** - 确保数据格式与表结构...
Hive 提供了多种方式来查看表信息,包括查看表结构信息、查看表中的分区信息、查看所有表等。例如,查看 logs 表中的分区信息: ``` hive> show partitions logs; ``` 查看所有表: ``` hive> SHOW TABLES; ``` 查看...
Hive的元数据库用于存储Hive的元数据,如表结构、分区信息等。常用的元数据库管理系统包括DERBY和Mysql。其中,DERBY是一个嵌入式数据库管理系统,Mysql是一个常用的关系数据库管理系统。 Hive数据存储 Hive的数据...
其中,窗口函数是HiveQL的一个重要组成部分,它可以在不改变表结构的情况下,对数据进行复杂的数据处理与分析。本文主要介绍Hive中的窗口函数,特别是SUM、AVG、MIN、MAX等基础函数的应用场景及其具体用法。 #### ...
需要注意的是,在进行数据导入时,确保数据格式与表结构相匹配是非常重要的。此外,在从本地文件系统或 HDFS 导入数据时,还需关注文件编码、分隔符等问题,以避免数据解析错误。希望本文能对您在使用 Hive 进行数据...
在实际操作中,我们可能会使用Hive进行ETL(Extract, Transform, Load)过程,从原始数据中抽取、转换并加载到Hive表中。然后通过HQL进行数据探索、统计分析、报表生成等任务。此外,Hive还支持与其他大数据组件如...
- **将数据插入到Hive表**:可以使用`INSERT INTO TABLE table_name [PARTITION (partition_spec)] SELECT ...`命令将数据从查询结果插入到Hive表中。 - **将查询结果写入文件系统**:通过`INSERT OVERWRITE ...
Apache Hive和Tez是大数据处理领域中的两个重要组件,它们在Hadoop生态系统中扮演着关键角色。本篇文章将深入探讨这两个工具以及它们如何协同工作。 Hive是基于Hadoop的数据仓库工具,它允许用户通过SQL(称为HQL,...