如何创建 Hive 派生表?

Posted

技术标签:

【中文标题】如何创建 Hive 派生表?【英文标题】:How to create Hive Derived Tables? 【发布时间】:2021-05-12 23:07:26 【问题描述】:

什么是hive派生表,如何创建以及何时使用?

是否应该使用相同的CREATE TABLE 语句创建它?

例如,关于这个主表

CREATE TABLE NYSE (`exchange` STRING, stock_symbol STRING, stock_date DATE, stock_price_open FLOAT, stock_price_high FLOAT, stock_price_low FLOAT, stock_price_close FLOAT, stock_volume INT, stock_price_avg_close FLOAT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

如何创建派生表来聚合和做一些最大/最小功能?

【问题讨论】:

【参考方案1】:

hive derived tables - 是子查询的花哨名称或公用表表达式。它不是物理表,但可以像配置单元查询语言中的表一样工作,这就是名称的原因。因此,您了解,Hive 派生表是使用查询中的附加 SELECT 动态构建的。它们使用临时空间并在查询执行完成后立即丢弃。

例如,您想将销售额转换为多种货币,您可以在下面的查询中使用,我在派生表中获取所有汇率,然后计算美元、欧元或印度卢比的汇率。 使用 CTE -

WITH CTE_EX_RATE as (select ex_rate, from_currency, to_currency from ex_rate_table)
select 
sales_id,
ex.ex_rate * sales_amount sales_usd ,
ex_eur.ex_rate * sales_amount sales_eur, 
ex_inr.ex_rate * sales_amount sales_inr
from sales s
left join CTE_EX_RATE ex on ex.from_currency = s.transaction_currency and ex.to_currency = 'USD'
left join CTE_EX_RATE ex_eur on ex_eur.from_currency = s.transaction_currency and ex_eur.to_currency = 'EUR'
left join CTE_EX_RATE ex_eur on ex_inr.from_currency = s.transaction_currency and ex_inr .to_currency = 'INR'

使用子查询 - 您也可以使用子查询编写相同的查询,如下所示。这也将创建派生表。

select 
sales_id,
ex.ex_rate * sales_amount sales_usd ,
ex_eur.ex_rate * sales_amount sales_eur, 
ex_inr.ex_rate * sales_amount sales_inr
from sales s
left join (select ex_rate, from_currency, to_currency from ex_rate_table) ex on ex.from_currency = s.transaction_currency and ex.to_currency = 'USD'
left join (select ex_rate, from_currency, to_currency from ex_rate_table) ex_eur on ex_eur.from_currency = s.transaction_currency and ex.to_currency = 'EUR'
left join (select ex_rate, from_currency, to_currency from ex_rate_table) ex_eur on ex_inr.from_currency = s.transaction_currency and ex_inr.to_currency = 'INR'

【讨论】:

澄清一下,sales 是您的物理表,而您的 ex_rate_table 是您的派生表(临时)? 是的,sales 是物理表,ex_rate_table 也是物理表。但是CTE_EX_RATE 是第一个 SQL 中的派生表。在第二种情况下,ex_eur, 'ex','ex_inr' 是派生表。

以上是关于如何创建 Hive 派生表?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL派生表

MySQL派生表

如何在派生表概念中转换此查询

派生类的 C++ 查找表

使用子查询与派生表进行内部联接

派生数据类型中的 Fortran、参数和静态表