hive和spark读写分区表NULL列

先创建一张非分区表 non_partitioned_table,并插入10条数据,其中部分 citygender 字段为空。随后我们基于这些数据创建写入分区表。

1. 创建非分区表

首先,创建一张非分区表 non_partitioned_table,包含所有所需的字段:

sql 复制代码
CREATE TABLE non_partitioned_table (
    name STRING,
    age INT,
    address STRING,
    mobile STRING,
    city STRING,
    gender STRING,
    year INT,
    month INT,
    date2 DATE,
    email STRING
)
STORED AS TEXTFILE;  -- 或者可以选择其他存储格式,如 ORC, Parquet 等

2. 插入数据

接下来,向这张表中插入10条数据,其中部分 citygender 字段为空:

sql 复制代码
INSERT INTO non_partitioned_table (name, age, address, mobile, city, gender, year, month, date2, email) VALUES
('Alice', 30, 'New York', '123456789', 'New York', 'Female', 2024, 1, '2024-01-01', 'alice@example.com'),
('Bob', 25, 'Los Angeles', '987654321', 'Los Angeles', 'Male', 2024, 2, '2024-02-01', 'bob@example.com'),
('Charlie', 35, 'Chicago', '111222333', NULL, 'Male', 2024, 3, '2024-03-01', 'charlie@example.com'),
('Diana', 28, 'Houston', '444555666', 'Houston', NULL, 2024, 4, '2024-04-01', 'diana@example.com'),
('Eve', 22, 'Miami', '777888999', 'Miami', 'Female', 2024, 5, '2024-05-01', 'eve@example.com'),
('Frank', 31, 'Seattle', '123456789', NULL, 'Male', 2024, 6, '2024-06-01', 'frank@example.com'),
('Grace', 27, 'San Francisco', '987654321', 'San Francisco', NULL, 2024, 7, '2024-07-01', 'grace@example.com'),
('Henry', 33, 'Boston', '111222333', 'Boston', 'Male', 2024, 8, '2024-08-01', 'henry@example.com'),
('Ivy', 29, 'Denver', '444555666', NULL, 'Female', 2024, 9, '2024-09-01', 'ivy@example.com'),
('Jack', 26, 'Phoenix', '777888999', 'Phoenix', NULL, 2024, 10, '2024-10-01', 'jack@example.com');
解释
  • 表结构 :创建了一张名为 non_partitioned_table 的表,包含 name, age, address, mobile, city, gender, year, month, date, email 这些字段。
  • 插入数据 :使用 INSERT INTO 语句一次性插入10条数据。部分记录的 citygender 字段被设置为 NULL
验证数据

你可以通过查询表来验证数据是否正确插入:

sql 复制代码
SELECT * FROM non_partitioned_table;

这会返回表中的所有记录。接下来,我们创建一个分区表并将这些数据从非分区表中导入到分区表中。

3. 创建分区表

首先,创建一个新的分区表 partitioned_table,并指定分区字段和表格式为 ORC:

sql 复制代码
CREATE TABLE partitioned_table (
    name STRING,
    age INT,
    address STRING,
    mobile STRING,
    date2 DATE,
    email STRING
)
PARTITIONED BY (
    city STRING,
    gender STRING,
    year INT,
    month INT
)
STORED AS ORC;

4. 设置动态分区参数

启用动态分区并设置模式为 nonstrict

sql 复制代码
SET hive.exec.dynamic.partition=true; -- 启用动态分区
SET hive.exec.dynamic.partition.mode=nonstrict; -- 允许在不指定所有分区字段的情况下进行动态分区

5. 插入数据

non_partitioned_table 中选择数据并插入到 partitioned_table 中,不处理 NULL 值:

sql 复制代码
INSERT INTO partitioned_table PARTITION (city, gender, year, month)
SELECT 
    name,
    age,
    address,
    mobile,
    date2,
    email,
    city,
    gender,
    year,
    month
FROM non_partitioned_table;
解释
  • 表结构 :创建了一张名为 partitioned_table 的表,包含 name, age, address, mobile, date, email 这些字段,并且有四个分区字段 city, gender, year, month
  • 动态分区 :通过设置 hive.exec.dynamic.partitionhive.exec.dynamic.partition.mode 参数,启用了动态分区功能。
  • 插入数据 :使用 INSERT INTO 语句从 non_partitioned_table 中选择数据并插入到 partitioned_table 中。分区字段 city, gender, year, monthSELECT 子句中被选中,Hive 将根据这些字段的值自动创建和写入分区。
验证数据

你可以通过查询表来验证数据是否正确插入:

sql 复制代码
SELECT * FROM partitioned_table;

这将返回表中的所有记录,确保数据已正确插入并分区。

6.Hive查询特定分区的数据

如果你想查询 citygenderNULL 的数据,可使用如下查询:

sql 复制代码
-- 查询 city 为 NULL 的数据
SELECT * FROM partitioned_table WHERE city = '__HIVE_DEFAULT_PARTITION__';

-- 查询 gender 为 NULL 的数据
SELECT * FROM partitioned_table WHERE gender = '__HIVE_DEFAULT_PARTITION__';

7.Spark-SQL查询hive分区表

分区字段为空的查询(有效的):

sql 复制代码
spark-sql --conf spark.sql.hive.convertMetastoreOrc=true -e "SELECT * FROM partitioned_table WHERE city is NULL;"

## spark3则不管这个参数如何设置都可以
spark3-sql --conf spark.sql.hive.convertMetastoreOrc=false -e "SELECT * FROM partitioned_table WHERE city is NULL"

以下这些都不可以(查不到数据):

shell 复制代码
spark-sql --conf spark.sql.hive.convertMetastoreOrc=false --conf spark.sql.orc.impl=hive --conf spark.sql.orc.filterPushdown=false  -e "SELECT * FROM partitioned_table WHERE city = '__HIVE_DEFAULT_PARTITION__';"

spark-sql --conf spark.sql.hive.convertMetastoreOrc=false --conf spark.sql.orc.impl=hive --conf spark.sql.orc.filterPushdown=false  -e "SELECT * FROM partitioned_table WHERE city is NULL"

spark-sql --conf spark.sql.hive.convertMetastoreOrc=false -e "SELECT * FROM partitioned_table WHERE city is NULL;"

spark-sql --conf spark.sql.hive.convertMetastoreOrc=false --conf spark.sql.orc.impl=hive --conf spark.sql.hive.optimize.ppd.storage=false -e "SELECT * FROM partitioned_table WHERE city = '__HIVE_DEFAULT_PARTITION__';"

spark3-sql --conf spark.sql.hive.convertMetastoreOrc=false --conf spark.sql.orc.impl=hive -e "SELECT * FROM partitioned_table WHERE city = '__HIVE_DEFAULT_PARTITION__';"
相关推荐
Raas1001 小时前
MAI Gateway(魔芋企业级AI网关)技术揭秘:AI网关支持哪些模型?从原理到落地
大数据·人工智能·网关·gateway·mai gateway·企业级产品
AlanBruce3 小时前
摩尔信使MThings功能综述与应用使用指南
linux·自动化·plc·mthings·摩尔信使
YangYang9YangYan3 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
大大大大晴天4 小时前
OpenMetadata VS DataHub VS Atlas VS Gravitino
大数据
Qyr997 小时前
2026全球汽车碳刷行业发展全景分析报告
大数据
陈陈CHENCHEN7 小时前
【Linux】服务器根目录磁盘扩容操作记录
linux·运维·服务器
蓝速科技8 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
精益数智工坊8 小时前
云计算环境数据怎么同步?云计算集成方案有哪些?
大数据·人工智能·数据挖掘·数据可视化
GeW8 小时前
RHCE快速拿证全攻略:考点拆解+实验强化+时间规划,一次通关
linux
码农小韩9 小时前
Linux应用开发(八)——TCP/IP网络编程基础
linux·嵌入式软件开发·linux操作系统·嵌入式操作系统·linux网络编程·linux应用