Hive中插入数据全为空(sql无误的情况下)

本文探讨了在使用Hive时遇到的一个常见问题——数据类型不匹配。作者分享了一个实例,即在写入数据时,实际类型与表定义类型不符,导致数据虽能成功写入HDFS,但在依据元数据读取时出现解析错误。文章强调了在Hive中这一问题的隐蔽性,并提醒开发者在遇到类似情况时要仔细检查数据类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(作者:陈玓玏 data-master

如果sql无误的情况下,其实这个问题很好解决。一个很可能的原因就是:
写入的数据类型和建表时定义的数据类型不一致。

我之前碰到这个问题,检查了sql很多遍,上层表的数据也检查了很多遍,都是没有问题的。这个时候,可以选择几条数据,不写入表,直接看结果,发现是有结果的。

再检查建表语句,发现建表语句是:

create table tmp.a
(id int
,name string
,class_one float
,class_two float
,class_three float
) partitioned by 
(type string)
stored as parquet

但写入时,class_one和class_two实际是string类型,定义时写错了,写成了float型,但写入时并未报错,应该是写入只是写入hdfs中,再更新元数据信息,依据元数据信息读取hdfs中的文件时无法解析对应字段,但不会妨碍写入文件系统。如果不是hive,其他数据碰到这个问题可能会报错的,但在hive中就不会,一定要小心这个问题。

如果sql没问题,直接select结果是正确的,那多半就是数据类型问题了。这样粗心的错误可能也只有我自己会犯了。

### 插入数据HiveHive SQL 提供了多种方式将数据插入到指定表中,具体语法取决于是否需要向分区插入数据或直接插入单行、多行记录。 #### 插入单行数据 可以直接使用 `INSERT INTO` 语句插入单条记录。例如,向名为 `my_table` 的表中插入一行数据: ```sql INSERT INTO my_table VALUES (1, 'Alice', 25); ``` 此操作适用于少量数据的快速插入[^1]。 #### 插入多行数据 虽然 Hive 支持逐条插入多行数据,但这种方式效率较低,尤其是在处理大量数据时,每条插入语句可能耗时约 1 秒左右,远慢于 MySQL数据库的批量插入性能[^2]。因此建议采用以下方法进行高效插入。 #### 从查询结果插入数据 可以使用 `INSERT INTO SELECT` 语句将一个表中的数据插入到另一个表中。例如,假设存在一个源表 `source_table` 和目标表 `target_table`,可执行如下操作: ```sql INSERT INTO TABLE target_table SELECT * FROM source_table WHERE some_condition; ``` 该方法适用于大批量数据的迁移和清洗操作,并能有效提升执行效率[^3]。 #### 向指定分区插入数据 如果目标表是分区表,则必须在插入时指定具体的分区值。例如,向 `t_partitioned_table` 表的 `dt='2023-10-01'` 和 `country='US'` 分区插入数据: ```sql INSERT INTO TABLE t_partitioned_table PARTITION (dt='2023-10-01', country='US') SELECT id, name, age FROM source_table WHERE condition; ``` 上述语句会将符合条件的数据插入到指定的分区中,且 `id`, `name`, `age` 字段需与目标表的非分区列匹配[^5]。 #### 多个分区同时插入数据 还可以根据不同的条件将数据插入到多个分区中,例如: ```sql FROM student INSERT INTO TABLE student_ptn PARTITION(city='MA') SELECT id, name, sex, age, department WHERE department='MA' INSERT INTO TABLE student_ptn PARTITION(city='IS') SELECT id, name, sex, age, department WHERE department='IS' INSERT INTO TABLE student_ptn PARTITION(city='CS') SELECT id, name, sex, age, department WHERE department='CS'; ``` 该语法允许一次性将数据按照不同条件分发到多个分区中,避免多次执行插入语句[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值