hive - 了解 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
为连接选择插入的行?
谢谢你。
解决方案
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。
推荐阅读
- ios - 为什么设置纵横比时会出错?
- c++ - 如何连接必须同时运行且独立运行的两个文件夹/项目的生成文件
- javascript - 使用单个 Firestore 文档中的字段更新 DOM
- javascript - WebAssembly 可以获取 javascript 回调吗?
- aspen - AspenTech IP.21 数据时区
- reactjs - Reactjs表格行按钮单击不起作用
- nginx - 重定向到另一个 html 文件
- twitter-bootstrap - flexbox中所有高度相同的div在底部
- javascript - Angular Material - 强制 chrome 自动填充以绘制整个输入
- api-platform.com - Api 平台:corsAllowOrigin 未设置 *