首页 > 解决方案 > 了解 Hive 表创建表示法

问题描述

我遇到了需要转换为 Redshift/MySql 等效的 Hive 表。我无法理解 Hive 查询结构,希望得到一些帮助:

CREATE TABLE IF NOT EXISTS table_1 (
    id BIGINT,
    price DOUBLE,
    asset string
)
PARTITIONED BY (
    pt STRING
);
ALTER TABLE table_1 DROP IF EXISTS PARTITION (pt== '${yyyymmdd}');

INSERT OVERWRITE TABLE table_1 PARTITION (pt= '${yyyymmdd}') 
select aa.id,aa.price,aa.symbol from
...
...
from
 table_2 table 

我无法理解 PARTITIONED BY 子句。如果我理解正确,这与 MySQL 表分区不同,并且是 Hive 特定的动态分区。分区不定义列或键,按当前日期进行分区。

这是否意味着 table_1 按日期分区?每天都有单独的分区?

然后稍后在代码中有类似于

inner join table_new table on table.pt = '${yyyymmdd}' and ...

在这种情况下,这是否意味着只yyyymmdd为连接选择插入的行?

谢谢你。

标签: hivecreate-tablehive-partitionshiveddl

解决方案


Hive 中的分区默认情况下是 HDFS 中的一个文件夹,其名称key=value+ 元数据位于 Hive 元存储中。您可以更改分区位置并在任何文件夹的顶部创建分区。

这定义了stringPARTITIONED BY (pt STRING)类型的分区列 pt ,而不是 date。分区值存储在元数据中。pt 列不存在于表数据文件中,它仅在 PARTITIONED BY 中定义,所有分区值都存储在元数据中。如果您动态加载分区,则会创建名称为 pt='value' 的分区文件夹。

这句话动态创建分区:

INSERT OVERWRITE TABLE table_1 PARTITION (pt) 
select id, price, symbol
       coln as pt            --partition column should be the last one
  from ...

而这句话加载单个 STATIC 分区:

INSERT OVERWRITE TABLE table_1 PARTITION (pt= '${yyyymmdd}') 
select aa.id,aa.price,aa.symbol 
  from

未选择分区列,分区值在

PARTITION  (pt= '${yyyymmdd}')

'${yyyymmdd}'这是一个带有名称的参数,yyyymmdd它使用如下方式传递给脚本--hivevar

 hive --hivevar yyyymmdd=20200604 -f myscript.sql 

在这种情况下,您可以将任何字符串作为分区值传递,尽管参数名称 yyyymmdd 表明它的格式。

Hive 中的 BTW 日期格式是格式中的'yyyy-MM-dd'字符串'yyyy-MM-dd'可以隐式转换为 DATE。


推荐阅读