18

在将平面文件中的数据加载到配置单元表中时,我得到了空值。
我的表结构是这样的:

hive> create table test_hive (id int,value string);

我的平面文件是这样的:input.txt

1   a
2   b
3   c
4   d
5   e
6   F
7   G
8   j

当我运行以下命令时,我得到空值:

hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive;
hive> select * from test_hive;
OK<br>
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL

截屏:

hive> create table test_hive (id int,value string);
OK
Time taken: 4.97 seconds
hive> show tables;
OK
test_hive
Time taken: 0.124 seconds
hive> LOAD DATA LOCAL INPATH '/home/hduser/input2.txt' OVERWRITE INTO TABLE test_hive;
Copying data from file:/home/hduser/input2.txt
Copying file: file:/home/hduser/input2.txt
Loading data to table default.test_hive
Deleted hdfs://hydhtc227141d:54310/app/hive/warehouse/test_hive
OK
Time taken: 0.572 seconds
hive> select * from test_hive;
OK
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL
Time taken: 0.182 seconds
4

6 回答 6

23

Hive 中的默认字段终止符是 ^A。您需要在 create table 语句中明确提及您正在使用不同的字段分隔符。

与 Lorand Bending 在评论中指出的类似,使用:

CREATE TABLE test_hive(id INT, value STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

您无需指定位置,因为您正在创建托管表(而不是外部表)。

于 2012-11-15T05:54:41.923 回答
6

您面临的问题是因为在您的数据中,字段由“”分隔,并且在创建表时您没有提及字段分隔符。因此,如果您在创建 hive 表时未提及字段分隔符,默认情况下 hive 将 ^A 视为分隔符。

因此,要解决您的问题,您可以重新创建提及以下语法的表,它会起作用。

CREATE TABLE test_hive(id INT, value STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

于 2015-11-25T17:29:55.600 回答
3

解决方案非常简单。表格没有以正确的方式创建。

您的问题或任何其他问题的简单解决方案是知道如何加载数据。

CREATE TABLE [IF NOT EXIST] mytableName(id int,value string)

行格式分隔

由“/t”终止的字段

存储为文本文件;

现在让我解释一下代码:

  1. 第一行创建您的表格。[IF NOT EXIST] 是可选的,它告诉表是否存在不要覆盖它。它更多的是安全措施。

  2. 第二行 在表级别为结构化字段指定分隔符。

  3. 第三项 您可以包含任何单个字符,但默认为“\001”。'/t' 用于制表符空间:在您的情况下为 '|' 用于彼此相邻并由 | 分隔的数据 ' ' 代表一个字符空间。等等...

  4. 第四行:指定要存储数据的文件类型。该文件可以是 TEXTFILE、SEQUENCEFILE、RCFILE 或 BINARY SEQUENCEFILE。或者,可以将数据的存储方式指定为 Java 输入和输出类。

本地加载时:

LOCD DATA LOCAL INPATH '/your/data/path.csv' [OVERWRITE] INTO TABLE myTableName;

始终尝试通过简单的 select* 语句检查您的数据。

希望能帮助到你。

于 2015-09-24T16:07:49.433 回答
1

Hive 的默认记录和字段分隔符列表:

  1. \n

  2. ^一个

  3. ^B

  4. ^C

按 ^V^A 可以在 Vim 中插入 ^A。

于 2014-06-25T09:58:22.520 回答
1

元素是用空格还是制表符分隔?让它的标签按照以下步骤操作。如果分隔空间使用 ' ' 而不是 '\t' 好的。

hive> CREATE TABLE test_hive(id INT, value STRING) row format
   delimited fields terminated by '\t' line formated by '\n' stored as filename;

比你必须输入

hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive;

hive> select * from test_hive;

现在您将获得准确的预期输出“文件名”。

于 2014-12-10T10:50:02.867 回答
1

请检查数据集日期列,它应遵循日期格式 yyyy-mm-dd 如果字符串的格式为“yyyy-mm-dd”,则返回对应于该年/月/日的日期值。如果字符串值与此格式不匹配,则返回 NULL。 Hive 官方文档

于 2017-10-07T09:43:19.957 回答