从.txt文件加载数据到以ORC格式存储在Hive中的表

37

我有一个数据文件,格式为.txt。我正使用这个文件将数据加载到Hive表中。当我像下面这样将文件加载到表中时:

CREATE TABLE test_details_txt(
visit_id INT,
store_id SMALLINT) STORED AS TEXTFILE;

使用正确地加载了数据。

LOAD DATA LOCAL INPATH '/home/user/test_details.txt' INTO TABLE test_details_txt;

我可以在Hive中对表运行SELECT * FROM test_details_txt;查询语句。

但是,如果我尝试将数据加载到一个表中,该表

CREATE TABLE test_details_txt(
visit_id INT,
store_id SMALLINT) STORED AS ORC; 

尝试运行SELECT时,我收到以下错误:

Failed with exception java.io.IOException:java.io.IOException: Malformed ORC file hdfs://master:6000/user/hive/warehouse/test.db/transaction_details/test_details.txt. Invalid postscript.

使用上面的LOAD语句加载数据时,我没有收到任何错误或异常。

在使用LOAD DATA IN PATH..命令将数据存储到ORC表时,是否还有其他需要完成的工作


请您发布您的 CREATE TABLELOAD DATASELECT 查询语句? - Sunny Nanda
5个回答

67

LOAD DATA只是将文件复制到Hive数据文件中。在将数据加载到表中时,Hive不会进行任何转换。

因此,在这种情况下,如果要将输入文件/home/user/test_details.txt加载到ORC表中,则需要以ORC格式存储。

一个可能的解决方法是创建一个使用STORED AS TEXT的临时表,然后将数据LOAD DATA到该表中,并从该表复制数据到ORC表中。

以下是一个示例:

CREATE TABLE test_details_txt( visit_id INT, store_id SMALLINT) STORED AS TEXTFILE;
CREATE TABLE test_details_orc( visit_id INT, store_id SMALLINT) STORED AS ORC;

-- Load into Text table
LOAD DATA LOCAL INPATH '/home/user/test_details.txt' INTO TABLE test_details_txt;

-- Copy to ORC table
INSERT INTO TABLE test_details_orc SELECT * FROM test_details_txt;

2
是的,我已经使用了这种临时表的方法。通过这种方法,我可以使用另一个Hive TXT表将数据加载到ORC表中。我感兴趣的是找到一种直接从文件加载数据到ORC表的方法。将输入文件保留在ORC格式中是否有帮助?我还没有尝试过。 - Neels
是的,如答案所述,您可以将输入文件保留在ORC格式中,然后将其简单地加载到ORC表中。 - Sunny Nanda
除非使用Spark,否则同样适用于Parquet。 - thebluephantom

5

步骤:

  1. 首先创建一个表,使用存储格式为TEXTFILE(即默认格式或任何你想要的格式)
  2. 将数据加载到文本表中。
  3. 使用存储格式为ORC创建表,如:create table orc_table stored as ORC as select * from text_table;
  4. 从ORC表中选择*。

示例:

CREATE TABLE text_table(line STRING);

LOAD DATA 'path_of_file' OVERWRITE INTO text_table;

CREATE TABLE orc_table STORED AS ORC AS SELECT * FROM text_table;

SELECT * FROM orc_table;   /*(it can now be read)*/

1

Hive不对输入数据进行任何转换,因此格式需要保持一致:文件应该是ORC格式,或者我们可以将数据从文本文件加载到Hive中的文本表中。


0

ORC文件是一种二进制文件格式,因此您无法直接将文本文件加载到ORC表中。 ORC代表“优化行列式”,这意味着它可以比其他文件格式以优化的方式存储数据。 ORC将原始数据的大小减小了75%。因此,数据处理速度也加快了。相比于Text、Sequence和RC文件格式,ORC显示出更好的性能。 一个ORC文件包含被称为Stripe的行数据组,以及一个文件页脚。当Hive处理数据时,ORC格式可以提高性能。

首先,您需要创建一个名为textFile的普通表格,将数据加载到textFile表格中,然后可以使用插入覆盖查询将数据写入ORC文件。

create table table_name1 (schema of the table) row format delimited by ',' | stored as TEXTFILE

create table table_name2 (schema of the table) row format delimited by ',' | stored as ORC

load data local inpath ‘path of your file’ into table table_name1;(loading data from a local system)

INSERT OVERWRITE TABLE table_name2 SELECT * FROM table_name1;

现在,您的所有数据都将存储在ORC文件中。

类似的过程也适用于Hive中的所有二进制文件格式,例如序列文件、RC文件和Parquet文件。

您可以参考下面的链接获取更多详细信息。

https://acadgild.com/blog/file-formats-in-apache-hive/


嗨...这是一个通用的答案,我应该说同样的事情适用于所有二进制文件,并在博客中用案例清楚地解释了。谢谢。 - Kiran Krishna Innamuri

0

在Hive中将数据加载到ORC文件格式的步骤

1.使用textFile格式创建一个普通表

2.将数据正常加载到此表中

3.使用stored as orcfile创建一个具有预期结果模式的表,与普通hive表相同

4.插入覆盖查询以将数据从textFile表复制到orcfile表

请参考博客学习如何将数据加载到Hive中的所有文件格式

将数据加载到Hive中的所有文件格式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接