Hive导出ORC表数据所遇到的乱码问题

背景

今天遇到一个临时需求,需求 Hive 中的表数据导出成文件的形式。以为很简单,谁知道遇到一些问题,所以记录下来了。

具体执行步骤

导出表:
连接 linux,输入如下命令:

hdfs dfs -get /user/hive/warehouse/student/dt=20230619 /opt/module/hive/datas/export/student.txt;

导出文件后,查看文件内容,然后发现乱码,然后查了些资料发现,hdfs dfs -get 命令不适用于导出 ORC 格式的数据,因为 ORC 是一种二进制格式,而 hdfs dfs -get 命令默认将二进制文件视为文本文件进行解析,从而导致乱码。

所以我们需要将 ORC 格式的数据转换为 TEXTFILE 格式的数据,从而保证 hdfs dfs -get 名利导出的数据不会乱码。

要将 ORC 数据转换为 TEXTFILE 格式数据,可以使用 Hive 的 INSERT OVERWRITE 语句并指定输出文件格式。具体步骤如下:

  1. 创建一个新的表用于存储转换后的数据,表结构和原始 ORC 表一致,但是文件格式为 TextFile。
CREATE TABLE student_text (
  id INT,
  name STRING,
  age INT
)
partition by(dt STRING COMMENT 'yyyyMMdd'ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
  1. 执行 INSERT INTO 语句将 ORC 表中的数据导入到新建的 TEXTFILE 表中。
INSERT OVERWRITE TABLE student_text partition(dt = '20230619')
SELECT id, name, age
FROM student where dt = '20230619';

但是当运行上述插入语句时,任务报错,报错主要信息如下:

java.lang.ClassCastException: org.apache.hadoop.hive.ql.io.orc.OrcSerde$OrcSerdeRow cannot be cast to org.apache.hadoop.io.BytesWritable

具体原因可以了解如下文章:
https://www.cnblogs.com/shudazhaofeng/p/15867919.html

这个问题是 Spark Sql 特有的,我们直接使用 Hive Sql 来进行上面的数据格式的转换操作就可以了。

这样就将 ORC 格式的数据转换为 TEXTFILE 格式的数据,然后我们直接将临时表的数据导出为文件形式,具体如下:

hdfs dfs -get /user/hive/warehouse/student_text/dt=20230619 /opt/module/hive/datas/export/student.txt;

此时我们再查看导出的文件中的数据就不会乱码了。

你可能感兴趣的:(Hadoop,hive,hadoop,spark,sql,hdfs导出数据)