Hive-加载数据与数据null值处理

简介: 本文讲述了实战中Hive加载业务数据基础全过程,以及加载数据的null值处理。这是一篇讲述了比较简单的案例,后面会分享其他实战经验。

Hive加载数据与数据null值处理

背景:load数据文件的数据流转的雏形通常是:
业务库 -> 数据文件 -> load进hive -> ods层
这里会面临最基础的两个问题:

  1. 通常我们需要一个跳板层,即将数据文件Load进stage层(text),然后通过查询加载进ODS层(ORC);
  2. 数据文件生成时,如果直接使用命令行的形式,字段null值将被直接赋值为'NULL'字符串;

RC File 和 ORC File 的区别

RC File(Record Columnar File)和ORC File(Optimized Row Columnar File)都是Hive中的列式存储格式,它们都旨在提高查询性能和降低存储成本,但有一些区别:

1. 存储方式不同:

  • RC File是将每个记录作为一个行存储,但每列都单独存储,因此数据被列分隔。列的数据被压缩在每个数据块内,可以根据需要使用Zlib、Snappy或LZO等算法进行压缩。
  • ORC File是将数据按行组织并存储在行组中,每个行组可以包含数千行记录,而每列单独存储,列的数据按列分隔存储。列数据被压缩在行组内,可以使用Snappy、Zlib、LZO、LZ4等算法进行压缩。

2. 压缩率和压缩效率不同:

  • ORC比RC更优秀的原因之一是,它可以基于数据类型和压缩算法选择更适合的压缩算法,以实现更好的压缩率和压缩效率。ORC压缩方式可以在每列和每行组上分别选择,根据实际数据的分布情况来选择更好的压缩算法。

3. 某些情况下ORC File查询效率更高,如以下情况:

  • 数据压缩:由于ORC File支持列存储和列压缩,可以在读取数据时减少磁盘I/O和网络带宽占用,因此在数据量较大或者需要跨网络传输时,ORC File的查询速度更快。
  • 列过滤:ORC File支持基于列的过滤,即在读取数据时,可以只读取查询中涉及的列,而无需读取所有的列数据。这可以进一步提高查询性能,特别是当数据包含多个列或者某些列数据比其他列数据更大时。
  • 列式存储:ORC File支持列存储,将相同的数据类型的数据放在一起存储,使得在查询中需要的列能够快速访问,而无需扫描整个行。

但是在某些情况下,RC File的查询效率又可能比ORC File更高。例如,如果数据量较小或者需要频繁地更新或删除数据,那么RC File可能比ORC File更适合。在选择文件格式时,需要根据实际情况和使用场景进行综合考虑。

4. 适用场景不同:

  • RC文件通常适用于OLTP(联机事务处理)类型的工作负载,因为它们通常需要执行较少的全表扫描,并且需要高度压缩,以减少I/O和网络负载。
  • ORC文件通常适用于OLAP(联机分析处理)类型的工作负载,因为它们通常需要执行大量的全表扫描和分析查询,因此需要更高的查询性能和更高的压缩比率,以便更快地检索和分析大型数据集。

RC File的建表语句示例

CREATE TABLE hive_table_rc
(
   id int comment '编号',
   name string comment '名称',
   money decimal(10, 2) comment '金钱'
) comment 'hive中rc格式的建表语句'
   STORED AS RCFILE;

ORC File的建表语句示例

CREATE TABLE hive_table_orc
(
   id int comment '编号',
   name string comment '名称',
   money decimal(10, 2) comment '金钱'
) comment 'hive中orc格式的建表语句'
   STORED AS ORC;

可以创建发现不同格式的表只是修改指定类型即可。在实际使用中,我们通常会在创建表时指定该表更多的属性,这可以解决如上述提到的null值问题,会在下文中提到。

关于两个基础问题

使用命令,将数据从业务库写出到数据文件

  1. 首先,我们使用cmd的方式将数据写入到数据文件
# 请注意,两个##之间是要替换的内容,如##port## -> 3306
mysql -h##hostname or IP address## -P##port## -u##username## -p##password## "##select * from table_test##" > ##table_test##
  1. 查看这个文件,会发现如果某个字段为null,该列将被写为'NULL'字符串
cat ##table_test##
  1. 此时有两种办法解决,第一种是使用sed命令,直接将所有的NULL替换掉,如下
sed -i 's/NULL//g' ##table_test##

但这种方式容易改变到其他字符串中真的携带了NULL的内容,所以更推荐第二种方式,如下

mysql -h##hostname or IP address## -P##port## -u##username## -p##password## "##select ifnull(name, '') from table_test##" > ##table_test##

这种方式将null转为''空字符串,这期间还可以加入replace函数,替换CHAR(10)和CHAR(13),避免换行符引起的数据错位。

将文件加载到HIVE

  1. 上述第3步中,我们已经将null转为''字符串,那么在创建HIVE表时(也可以修改已创建过的表),我们需要一些额外的配置,使''默认为null,我们的建表语句如下
CREATE TABLE my_table
(
    id    int comment '编号',
    name  string comment '名称',
    money decimal(10, 2) comment '金钱'
)
    ROW FORMAT DELIMITED
        FIELDS TERMINATED BY ','
        LINES TERMINATED BY '\n'
        NULL DEFINED AS ''
    STORED  AS TEXTFILE
    TBLPROPERTIES ("serialization.null.format"='');

NULL DEFINED AS ''将空字符串视为NULL值,'serialization.null.format'=''则用于指定NULL值在数据文件中的表示方式。通过这种方式,我们可以同时使用NULL DEFINED AS ''和serialization.null.format=''来将NULL值和空字符串表示在Hive中的一致性。
也可以修改已存在的表,如下

alter table my_table set serdeproperties('serialization.null.format' = '');
  1. 使用load语句,将数据加载进hive表中
-- 注意,使用了overwrite时是覆盖加载数据
LOAD DATA INPATH 'table_test' OVERWRITE INTO TABLE my_table;
相关文章
【Azure 事件中心】向Event Hub发送数据异常 : partitionId[null]: Sending messages timed out
【Azure 事件中心】向Event Hub发送数据异常 : partitionId[null]: Sending messages timed out
|
6月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 "",Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
321 0
|
11月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
169 4
|
11月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
288 3
|
11月前
|
SQL
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
136 2
|
11月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
280 0
|
SQL 物联网 数据处理
"颠覆传统,Hive SQL与Flink激情碰撞!解锁流批一体数据处理新纪元,让数据决策力瞬间爆表,你准备好了吗?"
【8月更文挑战第9天】数据时代,实时性和准确性至关重要。传统上,批处理与流处理各司其职,但Apache Flink打破了这一界限,尤其Flink与Hive SQL的结合,开创了流批一体的数据处理新时代。这不仅简化了数据处理流程,还极大提升了效率和灵活性。例如,通过Flink SQL,可以轻松实现流数据与批数据的融合分析,无需在两者间切换。这种融合不仅降低了技术门槛,还为企业提供了更强大的数据支持,无论是在金融、电商还是物联网领域,都将发挥巨大作用。
145 6
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之从mysql读数据写到hive报错,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
SQL DataWorks 监控
DataWorks产品使用合集之同步数据到Hive时,如何使用业务字段作为分区键
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。