You need to enable JavaScript to run this app.
导航
Hive 外表
最近更新时间:2025.01.10 19:19:13首次发布时间:2024.11.06 13:58:49

CnchHive为Bytehouse团队提供的一种表引擎,支持使用外表的方式进行联邦查询,用户无需通过数据导入,可以直接进行数据查询Hive中的数据。 从而提供了数据处理的灵活性和方便性。

背景信息

外部表的功能旨在提供除ByteHouse内部表以外的其他数据的处理能力。通过一条简单的DDL语句,即可在ByteHouse上创建一张外部表,建立ByteHouse表与外部数据源的关联。

  • 外部表在ByteHouse侧只会产生计算费用,遵循ByteHouse计算资源计费规则。
  • 使用外部表功能时,外部表的数据不会复制一份存在ByteHouse上并产生存储费用。存储费用请关注外部数据源存储侧计费规则。
  • 使用ByteHouse外部表访问外部数据源时,外部数据源可能会产生计算、访问、数据传输等费用,具体以外部数据源计费方式为准,请关注相应产品的说明。

使用限制
  • 当前仅支持 Parquet/Orc格式的数据。
  • 当前仅支持对Hive外表的select、insert操作,暂不支持alert;且当前仅支持Hive表,不支持视图View。
  • 当外部数据源的hive表schema变更时,当前不支持自动同步至ByteHouse外表,您需要在ByteHouse中重创建hive外表。

创建外部表

通过创建ByteHouse外部表,把对外部Hive表数据的描述引入到ByteHouse,即可实现对Hive数据的处理。
创建Hive外表时,您需指定关联的外表Hive库表信息,当前支持使用External Catalog的方式设置(下文的External Catalog,更推荐此种方式),或在建表DDL中直接指定(下文的通用建表DDL)。两种方式的建表DDL定义如下。

External Catalog(推荐)

使用External Catalog时,您需要先创建一个External Catalog保存好对应参数,后续可以直接通过三段式 catalog.db.table 访问外表。

  1. 创建External Catalog。以下为Las Catalog使用的简单示例,更多External Catalog的介绍请参见Hive Catalog

    CREATE EXTERNAL CATALOG `las_catalog` PROPERTIES 
    aws.s3.access_key='AK', 
    aws.s3.endpoint='tos-s3-cn-beijing.ivolces.com', 
    aws.s3.secret_key='SK', 
    lf_metastore_ak_id='AK',
    lf_metastore_ak_secret='SK', 
    lf_metastore_catalog='LF_CATALOG_NAME', 
    lf_metastore_region='cn-beijing', 
    lf_metastore_url = 'thrift://las_formation_endpoint', type='lf';
    
  2. 创建外表。

    CREATE TABLE t 
    Engine = CnchHive('thrift://host:port', 'hive_database_name', 'hive_table_name')
    SETTINGS cnch_vw_default ='your_vw';
    DESCRIBE TABLE t;
    

通用建表DDL

CREATE TABLE t 
Engin = CnchHive('thrift://hive_metastore:port', 'hive_database_name', 'hive_table_name')
SETTINGS endpoint = 'thrift://lakeformation.las.cn-beijing.ivolces.com:48869',
         region = 'cn-beijing',
         ak_id = 'AKLTMjU3ZTYzOG********yMGE0ZmJiZjc2ODkxZWMxY2Q',
         ak_secret = 'WlRkak56Ump**********sT0RCaU9UQm1NREV4WkRWaU1HWQ==',
         cnch_vw_default ='your_vw';
DESCRIBE TABLE t;

参数

配置说明

建表描述

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

说明

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

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

引擎参数(Engine)

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

设置参数(SETTINGS)

  • cnch_vw_default:用于指定计算组。如果未配置,则使用默认计算组。
  • Endpoint: 外部数据源的连接地址,以火山引擎Las为例,连接地址信息可参见Las帮助文档
  • Region : 外部数据源服务地域,如果服务商未提供则留空。
  • ak_id/ak_secrent,具有 Hive访问权限(包含 Hive Metastore 以及对应的对象存储)的密钥。

查询外部表

Hive外表的查询和普通表的查询操作基本一致。例如:

  • Catalog方式

    select * from  las_catalog.db.table where xxx;
    
  • 通用方式

    select * from  t where xxx;
    

查询加速:开启Disk Cache

  1. 申请开启Disk Cache功能。
    ByteHouse为您提供硬盘缓存能力,可将部分数据缓存在您的本地硬盘中,以提高查询效率。此功能默认关闭,如果您希望使用此功能,可联系技术支持人员开启功能。
  2. 功能开启后,在查询外表数据时,默认会使用硬盘缓存功能。

    说明

    如果您希望某次查询时关闭硬盘缓存,可在创建外表时设置SETTINGS参数,disk_cache_mode = 'SKIP_DISK_CACHE'

写入外部表

Hive外表的写入和普通表的写入操作基本一致。以创建Las Catalog后,向Las写入数据为例:

注意

写入 LasFormation 表前请确认:

  • 拥有 LasFormation 访问权限
  • 拥有 TOS 访问权限
  • TOS 开通HNS(分层桶) 功能

目前 CDW 不支持未开通的 HNS的 TOS Bucket 写入,更多关于TOS Bucket的HNS的介绍请参见TOS帮助文档

  • Catalog方式

    insert into/overwrite las_catalog.db.table values (xxx);
    insert into/overwrite las_catalog.db.table select * from xxx settings enable_optimizer =1;
    
  • 通用方式

    insert into/overwrite db.t values (xxx);
    

使用示例

建表示例1:通用示例

--创建hive外表
CREATE TABLE t
(
  client_ip   String,
  request     String,
  status_code INT,
  object_size INT,
  date String
)
ENGINE = CnchHive('psm', 'hive_database_name', 'hive_table_name')
PARTITION BY date;

--参数说明:
--psm:hivemetastore psm
--hive_database_name:hive表database name
--hive_table_name:hive表table name

--查询hive外表
select * from  t where xxx;

建表示例2:构建Hive bucket表

CREATE TABLE t
(
  client_ip   String,
  request     String,
  device_id   String,
  server_time String,
  date String
)
ENGINE = CnchHive('psm', 'hive_database_name', 'hive_table_name')
PARTITION BY date
CLUSTER BY device_id INTO 65536 BUCKETS 
ORDER BY server_time
SETTINGS cnch_vw_default ='your_vw'

--参数说明:
--psm:hivemetastore psm
--hive_database_name:hive表database name
--hive_table_name:hive表table name

--查询hive外表
select * from  t where xxx;

参数

配置说明

建表描述

  • 列名需要与hive表一一对应;列的顺序不需要与hive一一对应
  • 创建外表时,外表列可以只选择hive表中的部分列,但分区列必须要全部包含。
  • 外表列的分区需要通过partition by语句指定,同时需要与普通列一样定义到描述列表中。
  • 当Hive表为bucket 表时,建CnchHive引擎时需指定分桶列以及分桶数量。(CLUSTER BY xxx INTO xxx BUCKETS
  • 当Hive表中有ORDER BY字段,建CnchHive引擎时需指定ORDER BY字段。

引擎参数(Engine)

  • psm:hivemetastore psm
  • hive_database_name:指定hive中的数据库
  • hive_table_name:指定hive中的表,不支持view。

通用参考:列类型映射

hive列类型

CnchHive列类型

描述

INT/INTERGER

Nullable INT/INTERGER

BIGINT

Nullable BIGINT

TIMESTAMP

Nullable DateTime

STRING

Nullable String

VARCHAR

Nullable FixedString

内部转换为FixedString

CHAR

Nullable FixedString

内部转换为FixedString

DOUBLE

Nullable DOUBLE

FLOAT

Nullable FLOAT

DECIMAL

Nullable DECIMAL

MAP

Nullable Map

ARRAY

Nullable Array

查询报错处理

当查询报错时,可根据报错信息的关键词,参考下文排查处理。

关键词

解决方法

DB::Exception: Can not insert NULL data into non-nullable column "name"

列字段添加Nullable属性。

DB::Exception: The hive type is not match in cnch.

CnchHive schema type与Hive schema不匹配。

DB::Exception: column name xxx doesn't match.

CnchHive schema name与Hive schema不匹配。

DB::Exception: CnchHive only support parquet format. Current format is org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat.

CnchHive目前仅支持存储格式为Parquet。