数据未从csv文件正确加载到hive表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据未从csv文件正确加载到hive表相关的知识,希望对你有一定的参考价值。

嗨,我是stackoverflow的新手。我想将一个csv文件加载到一个配置单元表中。我使用以下方法创建了hive表:

 create table database1.table1(......) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

我还使用以下方法将数据加载到表中:

LOAD DATA INPATH .... OVERWRITE INTO TABLE database1.table1;

但当我运行这个:

select distinct col1 from table1;

我从其他列获取值以及col1中的值。

据我所知,数据未在hive表中正确加载(即列式)。

请帮我。

答案

您可以通过在HDFS中执行属于此表的文件的cat来检查这一点,并查看是否缺少任何记录的列值。

hdfs dfs -cat <hdfs_path/file>

如果您不知道它,可以通过在Hive中运行以下查询来获取此HDFS路径。

SHOW CREATE TABLE database1.table1;

在上面的查询结果中查找单词LOCATION,您可以获得HDFS路径。

提示:您可以将文件提取到本地并使用逗号作为分隔符在Excel工作表中加载数据,并查看是否看到任何行的任何缺失值。

要将文件从HDFS获取到本地:hdfs dfs -get <HDFS_Path> <local_path>

另一答案

你没错,数据没有在hive表中正确加载(即列式)。您将从其他列获取值以及来自col1的值,这意味着整个行值将存储/加载到第1列中。

用于创建表的完整语句未给出问题。所以我使用以下DDL语句来创建表。

create table table1 (
date_received string,
Product varchar(100),
Sub_product string,
Issue string,
Sub_issue string,
Consumer_complaint_narrative string,
Company_public_response string,
Company string,
State string,
ZIP_code string,
Tags string,
Consumer_consent_provided string,
Submitted_via string,
Date_sent_to_company string,
Company_response_to_consumer string,
Timely_response varchar(3),
Consumer_disputed string,
Complaint_ID bigint
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
with SERDEPROPERTIES ( "separatorChar"=",","skip.header.line.count"="1")
stored as textfile;

使用以下语句加载数据

load data inpath '/user/test/Complaints2months.csv' into table table1;

在我的本地验证这个并正在正确加载数据。希望这能解决你的问题。

笔记:

  1. “separatorChar”=“,” - 默认分隔符char为','因此在这种情况下此属性不是必需的。
  2. 而不是SERDE类,你也可以使用ROW FORMAT DELIMITED FIELDS TERMINATED BY','
  3. 表也​​以TEXT FILE格式存储。这是由于输入文件的格式。 'load data'命令不对数据进行任何转换。

以上是关于数据未从csv文件正确加载到hive表的主要内容,如果未能解决你的问题,请参考以下文章

Hive 外部表未从 CSV 源读取整个字符串

通过 Spark 将 csv 文件加载到现有的 HIVE 故事中

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

Hive:将hdfs中的gziped CSV作为只读加载到表中

URL 重定向未从正确的相对源加载资源

将数据从 CSV 文件映射到 HDFS 上的 Hive 表时出错