Hive Dialect
Flink allows users to write SQL statements in Hive syntax when Hive dialect is used. By providing compatibility with Hive syntax, we aim to improve the interoperability with Hive and reduce the scenarios when users need to switch between Flink and Hive in order to execute different statements.
Use Hive Dialect
Flink currently supports two SQL dialects: default
and hive
. You need to switch to Hive dialect before you can write in Hive syntax. The following describes how to set dialect with SQL Client and Table API. Also notice that you can dynamically switch dialect for each statement you execute. There’s no need to restart a session to use a different dialect.
SQL Client
SQL dialect can be specified via the table.sql-dialect
property. Therefore you can set the initial dialect to use in the configuration
section of the yaml file for your SQL Client.
execution:
type: batch
result-mode: table
configuration:
table.sql-dialect: hive
You can also set the dialect after the SQL Client has launched.
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.
Java
EnvironmentSettings settings = EnvironmentSettings.inStreamingMode();
TableEnvironment tableEnv = TableEnvironment.create(settings);
// to use hive dialect
tableEnv.getConfig().setSqlDialect(SqlDialect.HIVE);
// to use default dialect
tableEnv.getConfig().setSqlDialect(SqlDialect.DEFAULT);
Python
from pyflink.table import *
settings = EnvironmentSettings.in_batch_mode()
t_env = TableEnvironment.create(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
This section lists the supported DDLs with the Hive dialect. We’ll mainly focus on the syntax here. You can refer to Hive doc for the semantics of each DDL statement.
CATALOG
Show
SHOW CURRENT CATALOG;
DATABASE
Show
SHOW DATABASES;
SHOW CURRENT DATABASE;
Create
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION fs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
Alter
Update Properties
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);
Update Owner
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;
Update Location
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
Rename
ALTER TABLE table_name RENAME TO new_table_name;
Update Properties
ALTER TABLE table_name SET TBLPROPERTIES (property_name = property_value, property_name = property_value, ... );
Update Location
ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION fs_path;
The partition_spec
, if present, needs to be a full spec, i.e. has values for all partition columns. And when it’s present, the operation will be applied to the corresponding partition instead of the table.
Update File Format
ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;
The partition_spec
, if present, needs to be a full spec, i.e. has values for all partition columns. And when it’s present, the operation will be applied to the corresponding partition instead of the table.
Update SerDe Properties
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, ... )
The partition_spec
, if present, needs to be a full spec, i.e. has values for all partition columns. And when it’s present, the operation will be applied to the corresponding partition instead of the table.
Add Partitions
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, ...];
Add/Replace Columns
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
Rename
ALTER VIEW view_name RENAME TO new_view_name;
Update Properties
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 & DQL Beta
Hive dialect supports a commonly-used subset of Hive’s DML and DQL. The following lists some examples of HiveQL supported by the Hive dialect.
- SORT/CLUSTER/DISTRIBUTE BY
- Group By
- Join
- Union
- LATERAL VIEW
- Window Functions
- SubQueries
- CTE
- INSERT INTO dest schema
- Implicit type conversions
In order to have better syntax and semantic compatibility, it’s highly recommended to use HiveModule and place it first in the module list, so that Hive built-in functions can be picked up during function resolution.
Hive dialect no longer supports Flink SQL queries. Please switch to default
dialect if you’d like to write in Flink syntax.
Following is an example of using hive dialect to run some queries.
Flink SQL> create catalog myhive with ('type' = 'hive', 'hive-conf-dir' = '/opt/hive-conf');
[INFO] Execute statement succeed.
Flink SQL> use catalog myhive;
[INFO] Execute statement succeed.
Flink SQL> load module hive;
[INFO] Execute statement succeed.
Flink SQL> use modules hive,core;
[INFO] Execute statement succeed.
Flink SQL> set table.sql-dialect=hive;
[INFO] Session property has been set.
Flink SQL> select explode(array(1,2,3)); -- call hive udtf
+-----+
| col |
+-----+
| 1 |
| 2 |
| 3 |
+-----+
3 rows in set
Flink SQL> create table tbl (key int,value string);
[INFO] Execute statement succeed.
Flink SQL> insert overwrite table tbl values (5,'e'),(1,'a'),(1,'a'),(3,'c'),(2,'b'),(3,'c'),(3,'c'),(4,'d');
[INFO] Submitting SQL update statement to the cluster...
[INFO] SQL update statement has been successfully submitted to the cluster:
Flink SQL> select * from tbl cluster by key; -- run cluster by
2021-04-22 16:13:57,005 INFO org.apache.hadoop.mapred.FileInputFormat [] - Total input paths to process : 1
+-----+-------+
| key | value |
+-----+-------+
| 1 | a |
| 1 | a |
| 5 | e |
| 2 | b |
| 3 | c |
| 3 | c |
| 3 | c |
| 4 | d |
+-----+-------+
8 rows in set
Notice
The following are some precautions for using the Hive dialect.
- Hive dialect should only be used to process Hive meta objects, and requires the current catalog to be a HiveCatalog.
- Hive dialect only supports 2-part identifiers, so you can’t specify catalog for an identifier.
- While all Hive versions support the same syntax, whether a specific feature is available still depends on the Hive version you use. For example, updating database location is only supported in Hive-2.4.0 or later.
- Use HiveModule to run DML and DQL.
- Since Flink 1.15 you need to swap flink-table-planner-loader located in /lib with flink-table-planner_2.12 located in /opt to avoid the following exception. Please see FLINK-25128 for more details.