为什么这个简单的 Hive table 声明有效?仿佛变魔术

WHY does this simple Hive table declaration work? As if by magic

以下 HQL 用于在 HDInsight 中创建一个我可以成功查询的 Hive table。但是,我有几个关于它为何起作用的问题:

  1. 我的数据行实际上以回车 return 换行结束,那么为什么 'COLLECTION ITEMS TERMINATED BY [=31=]2' 有效? \002 到底是什么?并且没有指定 blob 的位置,所以,为什么这有效?

  2. 所有创建相同 table 和指定 "CREATE EXTERNAL TABLE...LOCATION '/user/hive/warehouse/salesorderdetail'" 的尝试都失败了。 table 已创建,但没有数据被 return 编辑。离开 "external" 并且不指定任何位置,突然它起作用了。 Wtf?

    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 '[=11=]2'
        MAP KEYS TERMINATED BY '[=11=]3'
    STORED AS TEXTFILE

非常感谢任何见解。

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

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 '[=12=]2'
        MAP KEYS TERMINATED BY '[=12=]3'
STORED AS TEXTFILE
LOCATION 'wasb://mycn-1@my.blob.core.windows.net/mycn-1/hive/warehouse/salesorderdetailx'
  1. 在 HDInsight 中创建群集时,必须指定基础 blob 存储。它假定您正在引用该 blob 存储。您不需要指定位置,因为您的查询正在创建一个在默认位置创建的内部 table(请参阅下面的答案 #2)。外部 table 需要在 Azure blob 存储(集群外部)中指定一个位置,以便在删除集群时不会删除 table 中的数据。有关详细信息,请参阅 the Hive DDL

  2. 默认情况下,tables 被创建为内部,您必须指定 "external" 才能使它们成为外部 tables。

    在以下情况下使用外部 tables:

    • 数据在 Hive 外部使用
    • 您需要实时更新数据
    • 删除集群或 table
    • 时需要数据
    • Hive 不应拥有数据和控制设置、目录等

在以下情况下使用内部 tables:

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

容器 "user/hive/warehouse/salesorderdetail" 是否存在于您的 blob 存储中?这可能解释了为什么您的外部 table 查询失败。