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. 某些
### 如何在Hive加载数据到外表 在外表(External Table)中,Hive允许用户将数据存储在HDFS上的特定位置,并且不会因删除表而丢失这些数据[^4]。这种特性使得外表非常适合于需要长期保留原始数据或者其他系统共享数据的场景。 #### 创建外部表并加载数据的方法 以下是创建外部表并将数据加载进去的具体方法: 1. **创建外部表** 首先,可以通过`CREATE EXTERNAL TABLE`语句来定义一张外部表。该命令会指定数据所在的HDFS路径。 ```sql CREATE EXTERNAL TABLE IF NOT EXISTS my_external_table ( id INT, name STRING, age INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/path/to/hdfs/data'; ``` 上述SQL语句创建了一张名为`my_external_table`的外部表,其字段由制表符`\t`分隔,并指定了数据位于HDFS路径`/path/to/hdfs/data`下[^3]。 2. **加载数据到外部表** 数据可以使用`LOAD DATA`语句直接加载至外部表所指向的HDFS目录中。需要注意的是,在加载过程中并不会改变原有数据的位置,而是将其链接到表结构中。 - 如果希望追加数据,则不带`OVERWRITE`选项: ```sql LOAD DATA INPATH '/source/path/on/hdfs' INTO TABLE my_external_table; ``` - 若想覆盖现有数据,则需加上`OVERWRITE`关键字: ```sql LOAD DATA INPATH '/source/path/on/hdfs' OVERWRITE INTO TABLE my_external_table; ``` 这里提到的`INPATH`参数应为有效HDFS路径或本地文件系统的绝对路径[^5]。 3. **处理NULL** 当涉及含有空数据集时,可设置相应的序列化属性以确保正确识别和解释这些特殊。例如,如果要将空字符串当作NULL对待,可通过如下方式调整表配置: ```sql ALTER TABLE my_external_table SET SERDEPROPERTIES ('serialization.null.format' = ''); ``` 此外,在初次加载数据前亦能利用`TBLPROPERTIES`完成类似设定[^5]。 #### 注意事项 - 删除外部表仅移除元数据而非实际数据文件[^4]。 - `LOCATION`子句明确指出数据所在物理地址,因此务必确认此路径存在且具有适当权限。 ```sql -- 示例:完整的创建加载流程 CREATE EXTERNAL TABLE IF NOT EXISTS employees_ext ( employee_id BIGINT, first_name STRING, last_name STRING, hire_date DATE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/user/hive/warehouse/employees_data'; LOAD DATA INPATH '/tmp/new_employees.csv' INTO TABLE employees_ext; ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值