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

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

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

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

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

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

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

  1. hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive;
  2. hive> select * from test_hive;
  3. OK<br>
  4. NULL NULL
  5. NULL NULL
  6. NULL NULL
  7. NULL NULL
  8. NULL NULL
  9. NULL NULL
  10. NULL NULL
  11. NULL NULL

屏幕截图:

  1. hive> create table test_hive (id int,value string);
  2. OK
  3. Time taken: 4.97 seconds
  4. hive> show tables;
  5. OK
  6. test_hive
  7. Time taken: 0.124 seconds
  8. hive> LOAD DATA LOCAL INPATH '/home/hduser/input2.txt' OVERWRITE INTO TABLE test_hive;
  9. Copying data from file:/home/hduser/input2.txt
  10. Copying file: file:/home/hduser/input2.txt
  11. Loading data to table default.test_hive
  12. Deleted hdfs://hydhtc227141d:54310/app/hive/warehouse/test_hive
  13. OK
  14. Time taken: 0.572 seconds
  15. hive> select * from test_hive;
  16. OK
  17. NULL NULL
  18. NULL NULL
  19. NULL NULL
  20. NULL NULL
  21. NULL NULL
  22. NULL NULL
  23. NULL NULL
  24. NULL NULL
  25. Time taken: 0.182 seconds
vaqhlq81

vaqhlq811#

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

  1. CREATE TABLE test_hive(id INT, value STRING)
  2. 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”确定。

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

比你必须进入

  1. hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive;
  2. hive> select * from test_hive;

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

ukxgm1gy

ukxgm1gy6#

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

相关问题