hive如何从hdfs中的文件创建表?

icnyk63a  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(875)

我对hdfs和hive还不熟悉。在阅读了一些书籍和文献资料之后,我对这两个方面都有了一些介绍。我有一个关于在hive中创建一个表的问题,hdfs中存在该表的文件。我有一个hdfs中有300个字段的文件。我想在hdfs中创建一个访问这个文件的表。但是我想利用这个文件中的30个字段。我的问题是1。配置单元是否创建单独的文件目录?2.我必须先创建配置单元表并从hdfs导入数据吗?3.既然我想创建一个300列中包含30列的表,那么hive是否只创建包含这30列的文件?4.我是否必须创建一个包含30列的单独文件并导入hdfs,然后创建指向hdfs目录的配置单元表?

w41d8nur

w41d8nur1#

我的问题是
配置单元是否创建单独的文件目录?如果创建配置单元表(托管/外部)并使用load命令加载数据,则为“是”。
如果创建外部表并指向现有文件,则为“否”。
我必须先创建配置单元表并从hdfs导入数据吗?
不一定可以创建配置单元外部表并指向此现有文件。
既然我想创建一个300列中包含30列的表,那么hive是否只创建包含这30列的文件?
使用hiveql可以很容易地做到这一点。遵循以下步骤(注意:这不是唯一的方法):
创建一个300列的外部表并指向现有文件。
创建另一个包含所需30列的配置单元表,并使用将数据从300列表插入此新表 "insert into table30col select ... from table300col" . 注意:在此插入操作期间,配置单元将创建包含30列的文件。
我是否必须创建一个包含30列的单独文件并导入hdfs,然后创建指向hdfs目录的配置单元表?
是的,这是另一种选择。我个人喜欢问题3中提到的解决方案,因为我不必重新创建文件,我可以在hadoop中完成所有这些,而不需要依赖其他系统。

qlvxas9a

qlvxas9a2#

你有几个选择。一种是让配置单元简单地指向现有文件,即创建一个externalhive表:

CREATE EXTERNAL TABLE ... LOCATION '<your existing hdfs file>';

显然,配置单元中的这个表将与现有表完全匹配。必须声明所有300列。不会有数据重复,只有一个文件,配置单元只是引用已经存在的文件。
第二种选择是将数据导入或加载到配置单元表中。这将把数据复制到配置单元表中,并让配置单元控制位置。但重要的是要了解导入和加载都不会转换数据,因此结果表的结构布局和存储与原始表完全相同。
我建议的另一个选项是创建一个特定的配置单元表,然后使用sqoop之类的工具将数据导入其中,或者通过上面的方法之一创建的中间暂存表(最好是外部引用以避免额外的副本)。创建所需的表,创建外部引用暂存表,使用insert将数据插入目标。。。选择,然后删除暂存表。我建议这样做,因为它不仅允许您控制表结构/模式(即只有所需的30列),而且重要的是,还允许您控制存储。hive有一种高性能的列存储格式,即orc,您应该很乐意使用这种存储格式,因为它可以极大地提高查询性能。

相关问题