You need to enable JavaScript to run this app.
导航
Hive 外表
最近更新时间:2025.01.16 10:43:42首次发布时间:2024.04.29 14:14:23

Bytehouse企业版支持使用外表的方式进行联邦查询,用户无需通过数据导入,可以直接进行数据查询Hive中的数据。 从而提供了数据处理的灵活性和方便性。本文为您介绍Hive外表的使用详情。

背景信息

ByteHouse 提供了多种方式来与外部系统集成,包括表引擎。像所有其他的表引擎一样,使用CREATE TABLEALTER TABLE查询语句即可完成配置,从用户的角度来看,配置的集成看起来像查询一个正常的表,但实际上对它的查询是代理给外部系统的。这种透明的查询是外表的主要优势之一,比如外部字典或表函数,它们需要在每次使用时使用自定义查询方法。

使用限制
  • ByteHouse 企业版版本在2.5及以上版本。

    说明

    ByteHouse 企业版从 2.5 版本开始支持 Hive 外表功能。

  • 当前仅支持对Hive外表的 SELECTALERT查询操作;且当前仅支持Hive表,不支持视图View、bucket表。
  • 当前仅支持如下输入格式:
    • ORC:支持除了char之外的简单的标量列类型;复杂类型只支持 array
    • Parquet

创建外部表

创建Hive外表时,ByteHouse为您提供了通用的建表DDL命令,此外,如果是集成LasFormation的Hive表,您也可以参考LasFormation集成方式进行外表创建,两种方式的介绍如下。

通用建表DDL

  • 2.6及以上版本(推荐)
    2.6及以上版本支持表结构自动推导,建表不需要指定列和分区键。

    CREATE TABLE table_name [ON CLUSTER cluster]
    ENGINE = HiveCluster(cluster, 'thrift://host:port', 'hive_database_name', 'hive_table_name')
    SETTINGS 
        endpoint = 'http://tos-s3-cn-beijing.ivolces.com', 
        ak_id = 'access_key', 
        ak_secret = 'secret_key'
    ;
    

    参数

    配置说明

    建表描述

    Hive表的列名和类型,以及Partition By key, Cluster By key,将会在建表的时候自动推导建立。列默认建立Nullable类型, 列类型映射规则见下文的 列类型映射 章节。

    说明

    创建Hive外表时,也可以指定列名和类型,以及分区键等描述( 不推荐)。指定时:

    • 列名需要与hive表一一对应;列类型需要与Hive表一致;列的顺序不需要与hive一一对应
    • 创建外表时,外表列可以只选择hive表中的部分列,但分区列必须要全部包含。
    • 外表列的分区需要通过partition by语句指定,同时需要与普通列一样定义到描述列表中。

    引擎参数(Engine)

    • thrift://hive_metastore:port:hivemetastore 的地址
    • hive_database_name:指定hive中的数据库
    • hive_table_name:指定hive中的表,不支持view、bucket表。

    设置参数(SETTINGS)

    • Endpoint: 外部数据源的连接地址,以火山引擎Las为例,连接地址信息可参见Las帮助文档
    • ak_id/ak_secrent:具有 Hive访问权限(包含 Hive Metastore 以及对应的对象存储)的密钥。
  • 2.5版本
    2.5版本不支持自动推导表结构,建表时需要指定列和分区键。

    CREATE TABLE [db.]table_name [ON CLUSTER cluster]
    (
        name1 [type1] [ALIAS expr1],
        name2 [type2] [ALIAS expr2],
        ...
    ) ENGINE = HiveCluster(cluster, 'thrift://host:port', 'hive_database', 'hive_table');
    PARTITION BY expr
    -- for hive table on S3
    SETTINGS 
        endpoint = 'http://tos-s3-cn-beijing.ivolces.com', 
        ak_id = 'access_key', 
        ak_secret = 'secret_key'
    ;
    

    建表参数与上文类似。

LasFormation集成

前提条件

如果您希望使用LasFormation集成,需先联系火山引擎技术支持人员,在部署时完成前期的环境配置等工作。完成后,后续才可使用LasFormation集成方式使用Hive外表。

创建Hive表

create table las_t 
Engine = HiveCluster('cluster_name', 'cache_key', 'las_database','las_table')
settings 
meta_type = 'lf',
lf_metastore_url = 'las_addr',
lf_metastore_ak_id = 'ak',
lf_metastore_ak_secret = 'sk',
lf_metastore_region = 'cn-beijing',
endpoint = 'tos-s3-cn-beijing.ivolces.com',
ak_id = 'ak', 
ak_secret = 'sk'

参数

配置说明

建表描述

Hive表的列名和类型,以及Partition By key, Cluster By key,将会在建表的时候自动推导建立。列默认建立Nullable类型, 列类型映射规则见下文的 列类型映射 章节。

说明

创建Hive外表时,也可以指定列名和类型,以及分区键等描述( 不推荐)。指定时:

  • 列名需要与hive表一一对应;列类型需要与Hive表一致;列的顺序不需要与hive一一对应
  • 创建外表时,外表列可以只选择hive表中的部分列,但分区列必须要全部包含。
  • 外表列的分区需要通过partition by语句指定,同时需要与普通列一样定义到描述列表中。

引擎参数(Engine)

  • cluster_name:ByteHouse的集群名称。
  • cache_key:是在内存中缓存的 las client 的名字,您可以自定义cache_key,同一个LasFormation 环境(同一个 lf_metastore_url)的表尽量保持一致即可。
  • las_database:LasFormation中数据库名称。
  • las_table:LasFormation中表名称。

设置参数(SETTINGS)

  • meta_type:外部数据源类型,配置为固定值'lf'。
  • lf_metastore_url:外部数据源的连接地址,以北京地域为例:thrift://lakeformation.las.cn-beijing.ivolces.com:48869,更多地域的连接地址信息可参见Las帮助文档
  • lf_metastore_ak_id/lf_metastore_ak_secret:具有 Hive访问权限(包含 Hive Metastore 以及对应的对象存储)的密钥。
  • lf_metastore_region:LasFormation的地域。
  • Endpoint: LasFormation数据存储的TOS访问域名,需配置为内网S3地址,以北京地域为例:tos-s3-cn-beijing.ivolces.com,更多地域的访问域名详情请参见TOS帮助文档
  • ak_id/ak_secrent:TOS的访问ak/sk。

创建Hive库

使用LasFormation集成时,您也可以直接创建Hive库,创建完成后,外部hive数据库下的表会自动映射进来。建库DDL如下。

说明

仅ByteHouse 企业版2.7及以上版本支持创建Hive库。

CREATE DATABASE hive_db [ON CLUSTER cluster_name]
ENGINE = Hive(cluster_name, 'thrift://host:port', 'hive_database')
settings 
meta_type = 'lf',
lf_metastore_url = 'las_addr',
lf_metastore_ak_id = 'ak',
lf_metastore_ak_secret = 'sk',
lf_metastore_region = 'cn-beijing',
endpoint = 'tos-s3-cn-beijing.ivolces.com',
ak_id = 'ak', 
ak_secret = 'sk'

建表参数与上文类似,其中:

  • lf_metastore_url:外部数据源的连接地址,以北京地域为例:thrift://lakeformation.las.cn-beijing.ivolces.com:48869,更多地域的连接地址信息可参见Las帮助文档
  • endpoint:LasFormation数据存储的TOS访问域名,需配置为内网S3地址,以北京地域为例:tos-s3-cn-beijing.ivolces.com,更多地域的访问域名详情请参见TOS帮助文档

查询表

通过SELECT 语句,查询创建的hive外表。SELECT 语句的具体可以参见 SQL 语法

select * from [db.]table_name  ... [SETTINGS ...]

在查询Hive外表时,有以下Setting项可选:

  • use_local_cache_for_remote_storage:是否开启disk cache,默认true。
  • enable_optimizer:是否开启优化器。

其中 use_local_cache_for_remote_storage 项默认开启,表示为远程文件系统启用了本地缓存,可以使得查询执行速度会更快。

修改表schema
  • 查看表schema

    DESCRIBE TABLE table_name;
    
  • 修改表schema
    在Hive schema 变动后, 可以手动更新CE中表的Schema,以保持和变动后的Hive schema 同步。

    ALTER TABLE table_name [ON CLUSTER cluster] REFRESH SCHEMA SETTINGS mutations_sync=1
    

使用示例
  • 通用DDL

    --创建hive外表
    CREATE TABLE hivetable ON CLUSTER ch_qa_cluster1
    ENGINE = HiveCluster('ch_qa_cluster1', 'thrift://localhost:9083', 'hive_database_name', 'hive_table_name')
    PARTITION BY date;
    
    --查询hive外表
    select * from hivetable where xxx settings use_local_cache_for_remote_storage=true,enable_optimizer=true;
    
  • LasFormation集成

    create table las_t 
    Engine = HiveCluster('cluster_name', 'cache_key', 'las_database','las_table')
    settings 
    meta_type = 'lf',
    lf_metastore_url = 'las_addr',
    lf_metastore_ak_id = 'ak',
    lf_metastore_ak_secret = 'sk',
    lf_metastore_region = 'cn-beijing',
    endpoint = 'tos-s3-cn-beijing.ivolces.com',
    ak_id = 'ak', 
    ak_secret = 'sk'
    

列类型映射

在创建外表的时候,可以参考以下类型映射表。

Hive 数据类型

ByteHouse 数据类型

备注

tinyint

Tinyint/Int8

大小写敏感

smallint

Smallint/Int16

大小写敏感

int

int

大小写不敏感

int

Int32

大小写敏感

bigint

Int64

大小写敏感

float

Float32

大小写敏感

double

Float64

大小写敏感

bigint

Bigint

大小写不敏感

string

String

大小写敏感

varchar(N)

FixedString(N)

大小写敏感

char(N)

FixedString(N)

大小写敏感

binary

String

大小写敏感

boolean

UInt8

大小写敏感

decimal(P,S)

Decimal(P,S)

大小写不敏感

date

Date

大小写不敏感

timestamp

DateTime

大小写不敏感

array

Array(xxx)

大小写敏感、圆括号

map<xxx, xxx>

Map(xxx, xxx)

大小写敏感、圆括号