2014-02-12 64 views
29

我有一个数据文件,格式为.txt。我正在使用该文件将数据加载到Hive表中。当我加载文件中的表类似将数据从.txt文件加载到表中作为ORC存储在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; 

,我可以在配置单元的表上运行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表中?

+0

能否请您发表您的'CREATE TABLE','LOAD DATA'和'SELECT'查询? –

+0

完成。现在检查。 – Neels

回答

49

LOAD DATA只是将文件复制到配置单元数据文件。在将数据加载到表中时,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

+0

是的,正如答案中提到的那样,您可以将输入文件保存为ORC格式,并将其简单地装载到ORC表中。 –

1

步骤使用TEXTFILE格式

2.Load加载在蜂房

1.创建一个正常表数据到ORC文件格式的数据通常成此表格

3.使用存储为orcfile的一般配置表格的预期结果创建一个表格

4.Insert覆盖查询到的数据从文本文件表复制到orcfile表

参考的博客,了解如何将数据加载到所有的文件格式在蜂巢

Load data into all file formats in hive

1

的动手由于Hive不会对我们的输入数据进行任何转换,所以格式必须相同:文件应该采用ORC格式,或者我们可以将数据从文本文件加载到Hive中的文本表中。

0

ORC文件是一种二进制文件格式,因此您不能直接将文本文件加载到ORC表中。 ORC代表Optimized Row Columnar,这意味着它可以以优于其他文件格式的方式存储数据。ORC将原始数据的大小减少到75%。结果数据处理的速度也增加了。 ORC显示比文本,序列和RC文件格式更好的性能。 ORC文件包含称为条带的组中的行数据以及文件页脚。 ORC格式提高了Hive处理数据时的性能。

首先,您需要创建一个普通表格作为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/

+0

嗨..同样的答案已经发布!谢谢 – Neels

+0

嗨...这是一个普遍的答案,我想说的是,同样的事情适用于所有的二进制文件,并已清楚地解释了博客中的用例。谢谢。 –

4

步骤:

  1. 首先创建一个表使用存储为TEXTFILE(即默认或你想创建表的格式 )
  2. 将数据加载到文本表格。
  3. 使用存储为ORC的表创建表,如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 not be read)*/ 
相关问题