为什么这个简单的Hive表声明有效?好像通过魔法

时间:2015-07-17 16:27:20

标签: hadoop hive azure-storage-blobs hdinsight

以下HQL可以在HDInsight中创建Hive表,我可以成功查询。但是,我有几个问题,为什么它有效:

  1. 我的数据行实际上是通过回车换行符来终止的,那么为什么' COLLECTION ITEMS TERMINATED BY \ 002'工作?什么是\ 002无论如何?并且没有指定blob的位置,因此,为什么这会起作用?

  2. 所有尝试创建同一个表并指定" CREATE EXTERNAL TABLE ... LOCATION' / user / hive / warehouse / salesorderdetail'"失败了。表已创建,但未返回任何数据。离开"外部"并且没有指定任何位置,突然它起作用。跆拳道?

  3.     CREATE TABLE IF NOT EXISTS default.salesorderdetail(
            SalesOrderID int,
            ProductID int,
            OrderQty int,
            LineTotal decimal
            )
        ROW FORMAT DELIMITED
            FIELDS TERMINATED BY ','
            COLLECTION ITEMS TERMINATED BY '\002'
            MAP KEYS TERMINATED BY '\003'
        STORED AS TEXTFILE
    

    非常感谢任何见解。

    更新:感谢您的帮助到目前为止。这是我用来尝试创建外部表的确切语法。 (我只更改了存储帐户名称。)我不知道自己做错了什么。

    drop table default.salesorderdetailx;
    
    CREATE EXTERNAL TABLE default.salesorderdetailx(SalesOrderID int,
           ProductID int,
           OrderQty int,
           LineTotal decimal)
    ROW FORMAT DELIMITED
            FIELDS TERMINATED BY ','
            COLLECTION ITEMS TERMINATED BY '\002'
            MAP KEYS TERMINATED BY '\003'
    STORED AS TEXTFILE
    LOCATION 'wasb://mycn-1@my.blob.core.windows.net/mycn-1/hive/warehouse/salesorderdetailx'
    

1 个答案:

答案 0 :(得分:2)

  1. 在HDInsight中创建群集时,必须指定基础blob存储。它假定您正在引用该blob存储。您不需要指定位置,因为您的查询正在创建在默认位置创建的内部表(请参阅下面的答案#2)。外部表需要在Azure blob存储中指定一个位置(在群集外部),以便在删除群集时不删除表中的数据。有关详细信息,请参阅the Hive DDL

  2. 默认情况下,表是作为内部创建的,您必须指定“外部”以使它们成为外部表。

    在以下情况下使用EXTERNAL表:

    • 数据在Hive外部使用
    • 您需要实时更新数据
    • 删除群集或表格时需要数据
    • Hive不应拥有数据和控件设置,目录等。
  3. 在以下情况下使用INTERNAL表:

    • 您希望Hive管理数据和存储
    • 短期使用(如临时表)
    • 基于现有表格创建表格(AS SELECT)

    blob存储中是否存在容器“user / hive / warehouse / salesorderdetail”?这可能解释了为什么外部表查询失败的原因。