hive如何从HDFS中存在的文件创建表?

时间:2017-04-27 06:02:19

标签: hive hdfs

我是HDFS和HIVE的新手。在阅读了一些书籍和文档后,我得到了一些介绍。我有一个关于在HIVE中创建表格的问题,其中文件存在于HDFS中。 我有这个文件在HDFS中有300个字段。我想在HDFS中创建一个访问该文件的表。但是我想利用这个文件中的30个字段。 我的问题是 1. hive是否创建单独的文件目录? 2.我是否必须先创建配置表并从HDFS导入数据? 3.由于我想创建一个包含300列中30列的表,hive是否只创建了一个包含30列的文件? 4.我是否必须创建一个包含30列的单独文件并导入HDFS,然后创建指向HDFS目录的hive表?

2 个答案:

答案 0 :(得分:0)

我的问题是

  1. hive是否会创建单独的文件目录? 如果您创建配置单元表(托管/外部)并使用load命令加载数据,则为YES。
  2. 如果您创建外部表并指向现有文件,则为NO。

    1. 我是否必须先创建hive表并从HDFS导入数据?
    2. 不一定您可以创建配置单元外部表并指向此现有文件。

      1. 由于我想创建一个包含300列中30列的表,hive是否会创建一个只包含30列的文件?
      2. 您可以使用hiveQL轻松完成。按照以下步骤(注意:这不是唯一的方法):

        • 创建一个包含300列的外部表并指向现有的列 文件。
        • 使用所需的30列创建另一个配置单元表,并使用"insert into table30col select ... from table300col"从300列表中将数据插入到此新表中。注意:hive会创建 在此插入操作期间有30列的文件。

          1. 我是否必须创建一个包含30列的单独文件并导入HDFS,然后创建指向HDFS目录的hive表?

        是的,这可以替代。 我个人喜欢问题3中提到的解决方案,因为我不必重新创建文件,我可以在hadoop中完成所有这些操作而不依赖于其他系统。

答案 1 :(得分:-2)

您有几种选择。一种是让Hive简单地指向现有文件,即创建一个外部 HIVE table

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

Hive中的这个表显然会与您现有的表完全匹配。您必须声明所有300列。没有数据重复,只有一个文件,Hive只是引用已经存在的文件。

第二个选项是将IMPORTLOAD数据放入Hive表中。这会将数据复制到Hive表中,让Hive控制位置。但重要的是要理解IMPORT和LOAD都不会转换数据,因此结果表将具有与原始表完全相同的结构布局和存储。

我建议另一个选项是创建一个特定的Hive表,然后使用Sqoop之类的工具或通过上述方法之一创建的中间临时表将数据导入其中(最好是外部参考,以避免额外的副本)。创建所需的表,创建外部参考登台表,使用INSERT ... SELECT将数据插入目标,然后删除登台表。我推荐这个,因为它不仅可以控制表结构/模式(即只有所需的30列),而且重要的是,它可以控制存储。 Hive具有高度柱状的高性能存储格式,即ORC,您应该茁壮成长使用此存储格式,因为它将为您提供极大的查询性能提升。