`

修复hive表存储格式为PARQUET的分区表中类型定义为int到float的过程

    博客分类:
  • hive
 
阅读更多

 

 

0 现象

仓库中一个业务表的一个指标是计算平均值,结果历史问题定义成int类型来存储(建表语句对应此字段为int),而且这个表是PARQUET类型的分区表。

 

 

实验方式1:

先建立原始表a的备份表b,使用前面文字中快速拷贝分区表的写法, 然后在b表中做实验,将b表的字段更新成double类型,然后在b表中随机某个分区内查询,分别在hue和hive命令行查询,看看是否报错

 

1.1 拷贝数据

创建备份表,在次表做实验
CREATE TABLE  dm_teach_school_subject_count_day_bak
(
id                   string comment 'mysql结果表中的自增主键,hive里留空串',
period_type          int comment '1:日,2:周,3:月,4:学期内(日)',
province_id          int comment '省份ID',
province_name        string comment '省份名称',
city_id              int comment '地市ID',
city_name            string comment '地市名称',
county_id            int comment '区县ID',
county_name          string comment '区县名称',
school_id            int comment '学校ID',
school_name          string comment '学校名称',
subject_id           string comment '科目ID',
subject_name         string comment '科目名称',
teacher_count        int comment '教师人数',
courseware_user_count int comment '创建课件人数',
courseware_user_count_rate float comment '创建课件人数比',
not_courseware_user_count int comment '未创建课件人数',
never_courseware_user_count int comment '从未创建课件人数',
never_courseware_user_count_rate float comment '从未创建课件人数比',
courseware_count     int comment '创建课件数',
avg_courseware_count int comment '平均创建课件数',

created_time         string comment '记录插入时间'
)
COMMENT '授课-按学校科目统计表日表'
PARTITIONED BY (day STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
STORED AS PARQUET;

 

1.2 将原来表 dm_teach_school_subject_count_day_bak 修改 avg_courseware_count 变成double 

 

alter table dm_teach_school_subject_count_day_bak change avg_courseware_count avg_courseware_count double  COMMENT '平均创建课件数' cascade; 

 

1.3 随机从 dm_teach_school_subject_count_day 中查询某天的 数据 看是否正常 

 

select * from dm_teach_school_subject_count_day_bak   where day = '2017-04-04' and avg_courseware_count > 0 ; 

 

结果: 在hive命令行正常查询到 ,在hue执行报错如下

 



 

 

实验方式2:

先建立原始表a的备份表c,使用前面文字中快速拷贝分区表的写法, 然后在c表中做实验,将b表的字段更新成string类型,然后在c表中随机某个分区内查询,分别在hue和hive命令行查询,看看是否报错

 

命令和上面步骤基本一样,只是将字段 avg_courseware_count 变成了 string, 操作结果如下:

hue和hive命令行都报错,如下:

Caused by: java.lang.UnsupportedOperationException: Cannot inspect org.apache.hadoop.io.IntWritable
        at org.apache.hadoop.hive.ql.io.parquet.serde.primitive.ParquetStringInspector.getPrimitiveJavaObject(ParquetStringInspector.java:77)
        at org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils.getDouble(PrimitiveObjectInspectorUtils.java:743)
        at org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter$DoubleConverter.convert(PrimitiveObjectInspectorConverter.java:238)
        at org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPGreaterThan.evaluate(GenericUDFOPGreaterThan.java:111)
        at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator._evaluate(ExprNodeGenericFuncEvaluator.java:186)
        at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77)
        at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:65)
        at org.apache.hadoop.hive.ql.exec.FilterOperator.processOp(FilterOperator.java:106)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:815)
        at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:97)
        at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:157)
        at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:497)
        ... 9 more

 

 

 

3 最终采用的方式:

新建表d,新表表的字段类型为正确的字段类型,然后将a表的分区数据拷贝到d表中,最后a表重命名为a_bak表,d表重命名为a表作为新的业务表a.

 

CREATE TABLE  dm_teach_school_subject_count_day_bak2
(
id                   string comment 'mysql结果表中的自增主键,hive里留空串',
period_type          int comment '1:日,2:周,3:月,4:学期内(日)',
province_id          int comment '省份ID',
province_name        string comment '省份名称',
city_id              int comment '地市ID',
city_name            string comment '地市名称',
county_id            int comment '区县ID',
county_name          string comment '区县名称',
school_id            int comment '学校ID',
school_name          string comment '学校名称',
subject_id           string comment '科目ID',
subject_name         string comment '科目名称',
teacher_count        int comment '教师人数',
courseware_user_count int comment '创建课件人数',
courseware_user_count_rate float comment '创建课件人数比',
not_courseware_user_count int comment '未创建课件人数',
never_courseware_user_count int comment '从未创建课件人数',
never_courseware_user_count_rate float comment '从未创建课件人数比',
courseware_count     int comment '创建课件数',
avg_courseware_count double comment '平均创建课件数',  ----> 指定正确类型
online_user_count    int comment '在线授课人数',
online_user_count_rate    float comment '在线授课人数比',
not_online_user_count int comment '未在线授课人数',
never_online_user_count int comment '从未在线授课人数',
never_online_user_count_rate float comment '从未在线授课人数比',
online_duration      int comment '在线授课时长(秒)',
avg_online_duration  int comment '平均在线授课时长(秒)',
created_time         string comment '记录插入时间'
)
COMMENT '授课-按学校科目统计表日表'
PARTITIONED BY (day STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
STORED AS PARQUET;

 

将原来表数据拷贝到新表中:

set hive.exec.dynamic.partition.mode=nonstrict;  必须设置
 
insert overwrite table dm_teach_school_subject_count_day_bak2 partition(day) 
select   
id,                   
period_type,          
province_id,          
province_name,        
city_id,              
city_name,            
county_id,            
county_name,
school_id ,           
school_name,          
subject_id ,          
subject_name ,        
teacher_count,
courseware_user_count,
courseware_user_count_rate,
not_courseware_user_count,
never_courseware_user_count,
never_courseware_user_count_rate,
courseware_count,
avg_courseware_count,
online_user_count,
online_user_count_rate,
not_online_user_count,
never_online_user_count,
never_online_user_count_rate,
online_duration,
avg_online_duration,
created_time,
day 
from dm_teach_school_subject_count_day  distribute by day; 

 

在 hue和hive命令行分别执行:

select * from dm_teach_school_subject_count_day_bak2   where day = '2017-04-04' and avg_courseware_count > 0 ;    结果均正常

 

  • 大小: 16.3 KB
分享到:
评论

相关推荐

    修改hive表分区名称

    - 修改Hive表分区名称的过程中,需要谨慎操作,尤其是当涉及到大量数据迁移时,应确保数据的完整性和一致性。 - 在修改完分区名称后,建议再次使用`SHOW PARTITIONS test;`命令来检查所有分区的信息,确保所有操作均...

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

    首先在源数据库上创建好分区表的定义,然后使用数据导出工具将非分区表的数据导出到一个文件中。接着,在目标数据库上删除原非分区表,并将数据从文件导入到新创建的分区表中。这种方法的优点是易于理解和操作,但...

    datax hdfsreader修改,支持 hive Parquet格式,支持读取hive Long,Int类型

    datax hdfsreader修改,支持 hive Parquet格式,支持读取hive Long,Int类型

    sqoop从mysql中导入数据到parquet格式的hive中

    sqoop导入数据到hive

    Hive表分区

    Hive表分区,里面有比较详细的Hive表分区方法,希望能够有所帮助。

    datax支持读取parquet格式文件,支持写入parquet格式文件,修复读取orc读取数据丢失问题

    新增的对Parquet格式的读取和写入支持意味着DataX现在可以更好地融入大数据工作流程,将数据高效地从一个Parquet文件系统迁移到另一个,或者从其他数据源导入到Parquet,为数据分析和处理提供便利。 其次,提到的...

    hive数据分区时分区字段不可为中文。.doc

    - **Hive 数据分区**是 Hive 表的一种组织方式,它允许将表中的数据按照某个列(分区键)的值进行划分,存储在不同的目录下。 - 分区有助于提高查询效率,因为当查询指定分区时,Hive 只需要扫描相关的分区,而...

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

    **一级静态分区表**是指表中的分区字段在创建时就已经定义好,并且在加载数据时需要显式指定分区信息。 ```sql CREATE TABLE my_partitioner1 ( id BIGINT, name STRING, time DATE, love VARCHAR(50) ) ...

    Hive表生成工具,Hive表生成工具Hive表生成工具

    Hive表生成工具,Hive表生成工具Hive表生成工具

    Hive的数据存储模式

    Hive的数据存储模式Hive的数据存储模式Hive的数据存储模式Hive的数据存储模式

    spark操作hive表源码

    这里,我们选择了Parquet格式(也可以是Hive支持的其他格式如ORC),并以追加模式写入名为`new_table`的Hive表。 Spark操作Hive表的底层实现涉及到多个组件的协同工作。SparkSQL会通过HiveMetastore获取表的元数据...

    spark或mr引擎插入的数据,hive表查询数据为0

    ### Spark或MR引擎插入的数据,Hive表查询数据为0的问题解析 #### 问题背景与现象 在大数据处理场景中,经常会遇到使用不同执行引擎(如Spark、MapReduce (MR) 或 Tez)进行数据处理的情况。其中一种常见的问题是...

    mysql数据抽取,自动生成hive建表语句

    4. **处理分区**:如果需要在Hive中创建分区表,可以分析MySQL表中的时间戳或分类字段,将其设置为Hive的分区字段。 5. **生成Hive建表语句**:基于上述信息,构造Hive的CREATE TABLE语句,包括表名、字段定义、...

    hive数据存储模式

    - 对于外部表,其数据不是存储在Hive为其自动创建的目录中,而是由用户自定义存储位置。 - 删除外部表时,只删除元数据,不删除实际的数据文件。 - 这种特性使得外部表非常适合用于共享数据或与非Hive应用进行...

    hive从入门到放弃(六)——常用文件存储格式.doc

    * 在 Hive 中,事务表需要指定为 ORC 存储格式。 三、Parquet Parquet 也是列式存储的。Parquet 的特点是: * 建表时需指定 STORED AS PARQUET,文件存储方式为二进制文件。 * 可以使用的压缩方式有 UNCOMPRESSED...

    1、通过亿级数据量在hive和impala中查询比较text、orc和parquet性能表现(一)

    本文通过亿级数据量在Hive和Impala中对比了text、orc和parquet这三种不同的文件格式,以分析它们的性能表现。 首先,让我们深入了解每种文件格式的特点: 1. **Parquet**: - 优点:Parquet采用了高效的压缩和...

    hive分区导入

    【标题】:“Hive分区导入”是大数据处理中常见的操作,它涉及到Hadoop生态中的Hive组件,用于高效管理和查询大规模数据。Hive是基于Hadoop的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供SQL类...

Global site tag (gtag.js) - Google Analytics