将 .txt 文件中的数据加载到 Hive 中存储为 ORC 的表中

Posted

技术标签:

【中文标题】将 .txt 文件中的数据加载到 Hive 中存储为 ORC 的表中【英文标题】:Loading Data from a .txt file to Table Stored as ORC in Hive 【发布时间】:2014-03-10 09:13:08 【问题描述】:

我有一个.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 查询? 【参考方案1】:

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;

【讨论】:

是的,我已经采用了这种临时表方法。有了这个,我可以使用另一个 Hive TXT 表在 ORC 表中加载数据。我感兴趣的是找到一种将数据直接从文件加载到 ORC 表中的方法。将输入文件保持为 ORC 格式有帮助吗?我还没试过。 是的,正如答案中提到的,您可以将输入文件保持为ORC格式,只需将其加载到ORC表中即可。 同样适用于镶木地板,除非使用 Spark。【参考方案2】:

步骤:

    首先使用存储为 TEXTFILE(即默认或 in 无论您想创建哪种格式的表格) 将数据加载到文本表中。 使用stored as ORC as select * from text_table 创建表; 从兽人表中选择 *。

例子:

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)*/

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

ORC 文件是二进制文件格式,因此不能直接将文本文件加载到 ORC 表中。 ORC 代表 Optimized Row Columnar,这意味着它可以以比其他文件格式优化的方式存储数据。 ORC 将原始数据的大小减少了 75%。结果,数据处理的速度也提高了。 ORC 表现出比文本、序列和 RC 文件格式更好的性能。 ORC 文件包含称为条纹的组中的行数据以及文件页脚。当 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/

【讨论】:

嗨...这是一个普遍的答案,我应该说同样的事情适用于所有二进制文件,并且在博客中用一个用例清楚地解释了。谢谢。【参考方案5】:

在 hive 中将数据加载为 ORC 文件格式的步骤

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

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

3.使用存储为 orcfile 的普通 hive 表的预期结果架构创建一张表

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

参考博客了解如何将数据加载到 hive 中的所有文件格式

Load data into all file formats in hive

【讨论】:

以上是关于将 .txt 文件中的数据加载到 Hive 中存储为 ORC 的表中的主要内容,如果未能解决你的问题,请参考以下文章

我们可以像在 Hive 中一样在 Big Query 中创建动态分区吗?

将云存储中的文本文件 (.txt) 加载到大查询表中

如何将hive查询结果导出成txt文件

如何将多个 xls 文件中的 xls 数据加载到 hive 中?

将数据加载到 Hive/Impala

LOAD DATA INPATH 将相同的基于 CSV 的数据加载到两个不同的外部 Hive 表中