Wait the light to fall

Hive 方言

焉知非鱼

Hive Dialect

Hive 方言

从 1.11.0 开始,当使用 Hive 方言时,Flink 允许用户用 Hive 语法编写 SQL 语句。通过提供与 Hive 语法的兼容性,我们旨在提高与 Hive 的互操作性,减少用户为了执行不同的语句而需要在 Flink 和 Hive 之间切换的情况。

使用 Hive 方言 #

Flink 目前支持两种 SQL 方言:默认和 Hive。在使用 Hive 语法编写之前,需要先切换到 Hive 方言。下面介绍如何通过 SQL Client 和 Table API 来设置方言。同时注意,你可以为你执行的每一条语句动态切换方言。不需要重新启动会话来使用不同的方言。

SQL 客户端 #

SQL 方言可以通过 table.sql-dialect 属性来指定,因此你可以在你的 SQL 客户端的 yaml 文件的配置部分设置初始方言。因此,你可以在 SQL 客户端的 yaml 文件的配置部分设置要使用的初始方言。

execution:
  planner: blink
  type: batch
  result-mode: table

configuration:
  table.sql-dialect: hive

你也可以在 SQL 客户端启动后设置方言。

Flink SQL> set table.sql-dialect=hive; -- to use hive dialect
[INFO] Session property has been set.

Flink SQL> set table.sql-dialect=default; -- to use default dialect
[INFO] Session property has been set.

Table API #

You can set dialect for your TableEnvironment with Table API.

from pyflink.table import *

settings = EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build()
t_env = BatchTableEnvironment.create(environment_settings=settings)

# to use hive dialect
t_env.get_config().set_sql_dialect(SqlDialect.HIVE)
# to use default dialect
t_env.get_config().set_sql_dialect(SqlDialect.DEFAULT)

DDL #

本节列出了 Hive 方言支持的 DDL。在这里我们将主要关注语法。关于每个 DDL 语句的语义,你可以参考 Hive 文档

DATABASE #

  • Show
SHOW DATABASES;
  • Create
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  [COMMENT database_comment]
  [LOCATION fs_path]
  [WITH DBPROPERTIES (property_name=property_value, ...)];
  • Alter

更新属性

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);

更新所有者

ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;

更新位置

ALTER (DATABASE|SCHEMA) database_name SET LOCATION fs_path;
  • Drop
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
  • Use
USE database_name;

TABLE #

  • Show
SHOW TABLES;
  • Create
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
  [(col_name data_type [column_constraint] [COMMENT col_comment], ... [table_constraint])]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [
    [ROW FORMAT row_format]
    [STORED AS file_format]
  ]
  [LOCATION fs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]
  
row_format:
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
      [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
      [NULL DEFINED AS char]
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, ...)]
  
file_format:
  : SEQUENCEFILE
  | TEXTFILE
  | RCFILE
  | ORC
  | PARQUET
  | AVRO
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
  
column_constraint:
  : NOT NULL [[ENABLE|DISABLE] [VALIDATE|NOVALIDATE] [RELY|NORELY]]
  
table_constraint:
  : [CONSTRAINT constraint_name] PRIMARY KEY (col_name, ...) [[ENABLE|DISABLE] [VALIDATE|NOVALIDATE] [RELY|NORELY]]
  • Alter

重命名

ALTER TABLE table_name RENAME TO new_table_name;

更新属性

ALTER TABLE table_name SET TBLPROPERTIES (property_name = property_value, property_name = property_value, ... );

更新位置

ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION fs_path;

partition_spec 如果存在,需要是一个完整的规格,即有所有分区列的值。而当它存在时,操作将被应用到相应的分区而不是表。

更新文件格式

ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;

partition_spec 如果存在,需要是一个完整的规格,即有所有分区列的值。而当它存在时,操作将被应用到相应的分区而不是表。

更新 SerDe 属性

ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];
 
ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;
 
serde_properties:
  : (property_name = property_value, property_name = property_value, ... )

partition_spec 如果存在,需要是一个完整的规格,即有所有分区列的值。而当它存在时,操作将被应用到相应的分区而不是表。

添加分区

ALTER TABLE table_name ADD [IF NOT EXISTS] (PARTITION partition_spec [LOCATION fs_path])+;
  • Drop Partitions
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...];
  • 新增/替换 列
ALTER TABLE table_name
  ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  [CASCADE|RESTRICT]
  • Change Column
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type
  [COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];
  • Drop
DROP TABLE [IF EXISTS] table_name;

VIEW #

  • Create
CREATE VIEW [IF NOT EXISTS] view_name [(column_name, ...) ]
  [COMMENT view_comment]
  [TBLPROPERTIES (property_name = property_value, ...)]
  AS SELECT ...;
  • Alter

注意:改变视图只在表 API 中工作,但不支持通过 SQL 客户端。

重命名

ALTER VIEW view_name RENAME TO new_view_name;

更新属性

ALTER VIEW view_name SET TBLPROPERTIES (property_name = property_value, ... );
  • Update As Select
ALTER VIEW view_name AS select_statement;
  • Drop
DROP VIEW [IF EXISTS] view_name;

FUNCTION #

  • Show
SHOW FUNCTIONS;
  • Create
CREATE FUNCTION function_name AS class_name;

Drop

DROP FUNCTION [IF EXISTS] function_name;

DML #

NSERT #

INSERT (INTO|OVERWRITE) [TABLE] table_name [PARTITION partition_spec] SELECT ...;

partition_spec,如果存在的话,可以是完整规格或部分规格。如果 partition_spec 是部分规格,动态分区列名可以省略。

DQL #

目前,Hive 方言支持的 DQL 语法与 Flink SQL 相同。详情请参考 Flink SQL 查询。而且建议切换到默认方言来执行 DQL。

注意事项 #

以下是使用 Hive 方言的一些注意事项。

  • Hive 方言只能用于操作 Hive 表,而不是通用表。而且 Hive 方言应该和 HiveCatalog 一起使用。
  • 虽然所有的 Hive 版本都支持相同的语法,但是否有特定的功能还是取决于你使用的 Hive 版本。例如,更新数据库位置只在 Hive-2.4.0 或更高版本中支持。
  • Hive 和 Calcite 有不同的保留关键字集。例如,在 Calcite 中默认是保留关键字,而在 Hive 中是非保留关键字。即使是 Hive 方言,你也必须用反引号(`)来引用这些关键字,才能将它们作为标识符使用。
  • 由于扩展查询不兼容,在 Flink 中创建的视图不能在 Hive 中查询。

原文链接: https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/hive/hive_dialect.html