为什么这个简单的 Hive table 声明有效?仿佛变魔术
WHY does this simple Hive table declaration work? As if by magic
以下 HQL 用于在 HDInsight 中创建一个我可以成功查询的 Hive table。但是,我有几个关于它为何起作用的问题:
我的数据行实际上以回车 return 换行结束,那么为什么 'COLLECTION ITEMS TERMINATED BY [=31=]2' 有效? \002 到底是什么?并且没有指定 blob 的位置,所以,为什么这有效?
所有创建相同 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'
在 HDInsight 中创建群集时,必须指定基础 blob 存储。它假定您正在引用该 blob 存储。您不需要指定位置,因为您的查询正在创建一个在默认位置创建的内部 table(请参阅下面的答案 #2)。外部 table 需要在 Azure blob 存储(集群外部)中指定一个位置,以便在删除集群时不会删除 table 中的数据。有关详细信息,请参阅 the Hive DDL。
默认情况下,tables 被创建为内部,您必须指定 "external" 才能使它们成为外部 tables。
在以下情况下使用外部 tables:
- 数据在 Hive 外部使用
- 您需要实时更新数据
- 删除集群或 table
时需要数据
- Hive 不应拥有数据和控制设置、目录等
在以下情况下使用内部 tables:
- 您希望 Hive 管理数据和存储
- 短期使用(如临时 table)
- 根据现有 table 创建 table (AS SELECT)
容器 "user/hive/warehouse/salesorderdetail" 是否存在于您的 blob 存储中?这可能解释了为什么您的外部 table 查询失败。
以下 HQL 用于在 HDInsight 中创建一个我可以成功查询的 Hive table。但是,我有几个关于它为何起作用的问题:
我的数据行实际上以回车 return 换行结束,那么为什么 'COLLECTION ITEMS TERMINATED BY [=31=]2' 有效? \002 到底是什么?并且没有指定 blob 的位置,所以,为什么这有效?
所有创建相同 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'
在 HDInsight 中创建群集时,必须指定基础 blob 存储。它假定您正在引用该 blob 存储。您不需要指定位置,因为您的查询正在创建一个在默认位置创建的内部 table(请参阅下面的答案 #2)。外部 table 需要在 Azure blob 存储(集群外部)中指定一个位置,以便在删除集群时不会删除 table 中的数据。有关详细信息,请参阅 the Hive DDL。
默认情况下,tables 被创建为内部,您必须指定 "external" 才能使它们成为外部 tables。
在以下情况下使用外部 tables:- 数据在 Hive 外部使用
- 您需要实时更新数据
- 删除集群或 table 时需要数据
- Hive 不应拥有数据和控制设置、目录等
在以下情况下使用内部 tables:
- 您希望 Hive 管理数据和存储
- 短期使用(如临时 table)
- 根据现有 table 创建 table (AS SELECT)
容器 "user/hive/warehouse/salesorderdetail" 是否存在于您的 blob 存储中?这可能解释了为什么您的外部 table 查询失败。