hadoop—将平面文件中的数据加载到配置单元表时获取空值

rbpvctlc  于 2021-06-03  发布在  Hadoop
关注(0)|答案(6)|浏览(315)

我在将平面文件中的数据加载到配置单元表时获取空值。
我的表结构如下:

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
vaqhlq81

vaqhlq811#

配置单元中的默认字段终止符是^a。您需要在CREATETABLE语句中明确指出您正在使用不同的字段分隔符。
与lorand bending在评论中指出的类似,使用:

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

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

szqfcxe2

szqfcxe22#

配置单元的默认记录和字段分隔符列表:
\不
^a
^b类
^c级
按^v^a可在vim中插入^a。

3b6akqbq

3b6akqbq3#

您面临的问题是,在数据中,字段由“”分隔,并且在创建表时没有提到字段分隔符。因此,如果在创建配置单元表时没有提到字段分隔符,默认情况下,配置单元会将^a视为分隔符。
为了解决您的问题,您可以重新创建包含以下语法的表,这样就可以了。 CREATE TABLE test_hive(id INT, value STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

cgvd09ve

cgvd09ve4#

解决办法很简单。表的创建方式不正确。
解决您的问题或任何其他问题的简单方法是知道如何加载数据。
创建表[如果不存在]mytablename(id int,值字符串)
行格式分隔
以'/t'结尾的字段
存储为文本文件;
现在让我解释一下代码:
创建表的第一行。[if not exist]是可选的,它指示表是否存在,而不是覆盖它。更多的是安全措施。
第二行在表级别为结构化字段指定分隔符。
第三项可以包含任何单个字符,但默认值为“\001”/“t”表示制表符空间:在您的例子中,“|”表示相邻的数据,用“|”分隔一个字符空间。等等。。。
第四行:指定要存储数据的文件类型。文件可以是textfile、sequencefile、rcfile或binary sequencefile。或者,可以将数据的存储方式指定为java输入和输出类。
本地加载时:
locd data local inpath“/your/data/path.csv”[覆盖]到表mytablename;
总是尝试用一个简单的select*语句检查数据。
希望有帮助。

yzuktlbb

yzuktlbb5#

元素是用空格还是制表符分隔的?让我们按照这些步骤来做。如果分隔为空格,请使用“”而不是“\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;

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

ukxgm1gy

ukxgm1gy6#

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

相关问题