Hive 配置单元如何从HDFS中的文件创建表?

Hive 配置单元如何从HDFS中的文件创建表?,hive,hdfs,Hive,Hdfs,我是HDFS和HIVE的新手。在阅读了一些书籍和文档之后,我对这两个方面都有了一些介绍。我有一个关于在配置单元中创建表的问题,HDFS中存在该表的文件。 我有一个HDFS格式的300个字段的文件。我想在HDFS中创建一个访问此文件的表。但是我想利用这个文件中的30个字段。 我的问题是 1.配置单元是否创建单独的文件目录? 2.我必须先创建配置单元表并从HDFS导入数据吗? 3.因为我想创建一个300列中有30列的表,所以配置单元是否只创建一个包含这30列的文件? 4.我是否必须创建一个包含30列

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

您有几个选项。一种是让配置单元简单地指向现有文件,即创建一个外部文件:

创建外部表。。。位置“”;
显然,配置单元中的此表将与现有表完全匹配。必须声明所有300列。不会有数据重复,只有一个文件,配置单元只引用已经存在的文件

第二种选择是要么将数据保存到配置单元表中。这将把数据复制到配置单元表中,并让配置单元控制位置。但重要的是要理解,导入和加载都不会转换数据,因此结果表的结构布局和存储与原始表完全相同

我建议的另一种选择是创建一个特定的配置单元表,然后使用类似工具或通过上述方法之一创建的中间暂存表(最好是外部引用以避免额外副本)将数据导入其中。创建所需的表,创建外部引用临时表,使用将数据插入目标,然后删除临时表。我建议这样做,因为它不仅可以让您控制表结构/模式(即只有所需的30列),更重要的是,还可以控制存储。Hive有一种高性能的列存储格式,也就是说,您应该能够很好地使用这种存储格式,因为它将极大地提高查询性能。

我的问题是

  • 配置单元是否创建单独的文件目录? 如果创建配置单元表(托管/外部)并使用load命令加载数据,则选择“是” 如果创建外部表并指向现有文件,则为否

  • 我必须先创建配置单元表并从HDFS导入数据吗
  • 不一定可以创建配置单元外部表并指向此现有文件

  • 因为我想创建一个300列中有30列的表,所以配置单元是否只创建一个包含这30列的文件
  • 您可以使用hiveQL轻松地完成这项工作。遵循以下步骤(注意:这不是唯一的方法):

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

    • 我是否必须创建一个包含30列的单独文件并导入HDFS,然后创建指向HDFS目录的配置单元表
    是的,这可以是一个替代方案。
    我个人喜欢问题3中提到的解决方案,因为我不必重新创建文件,我可以在hadoop中完成所有这一切,而不需要依赖其他系统。

    我没有得到staging table行。在配置单元或某个外部数据库/文件系统中创建的中间暂存表在哪里?为什么我们需要sqoop?我对sqoop的理解是——它用于从HDFS中摄取数据,并将其输入HDFS。这个答案充满了错误和误导性信息。将其标记为删除。(1)创建外部表(2)您只需声明到所需最后一列的列(假设这是一个分隔文件)(3)
    LOAD
    在HDFS中移动文件,而不是复制它们(它从本地fs复制)(4)
    导入
    需要由
    导出
    创建的特定格式的数据和元数据,但实际情况并非如此。(5)
    Sqoop
    用于将数据从“结构化数据存储(如关系数据库)”移动,而不是从HDF移动到HDFS@DuduMarkovitz真的,这就是“删除标志”的栏吗?链接到实际DDL规范的语法指南不完整?@v83rahul临时表正是公认答案中的场景3。至于sqoop,它可以读取分隔文件并写入配置单元,这使它成为导入和转换的有效选择。请添加一个数据示例(假设为3行)。说明要检索的列(至少是最后一列)
     CREATE EXTERNAL TABLE ... LOCATION '<your existing hdfs file>';