Hive 是否需要显式命令将数据从 HDFS 加载到表中

问题描述

这有什么区别:

CREATE TABLE dbo.table1(
 id INT,firstname STRING,) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS /usr/hive/sample_data.csv
;

CREATE TABLE dbo.table1(
 id INT,firstname STRING
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
;

然后

LOAD DATA INPATH '/usr/hive/sample_data.csv' INTO dbo.table1;

解决方法

第一个创建语句是完全错误的:STORED AS 应该是 TEXTFILE、ORC、Parquet 等,它不是位置,当然创建表时不应该提供文件名。 hive 中的表是在位置(文件夹)而不是文件上创建的,并且表位置的属性是 LOCATION,而不是 STORED AS。查看最近的示例:https://stackoverflow.com/a/68095278/2700344

第二个创建语句创建没有指定位置的表(默认位置将用于托管表,例如 /user/hive/warehouse/dbo/table1 ),请参阅此处更多详细信息https://stackoverflow.com/a/67073849/2700344 执行 DESC FORMATTED dbo.table1 并检查 LOCATION。

是的,您需要执行加载数据,因为您的文件不在表位置。如果将文件放置到该表的某个专用位置,则可以创建外部表并指定位置。但是您的文件当前位于不应用作表位置的文件夹中:/usr/hive。这个 /usr/hive/table1 看起来好多了。或者,您可以像在第二个 CREATE 语句中一样创建表,然后使用 hadoop fs cp 命令将文件复制到它的位置。 LOAD DATA does the same

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...