首頁 > 軟體

Clickhouse系列之整合Hive資料倉儲範例詳解

2022-10-16 14:04:35

前言

什麼是Hive? Apache Hive 資料倉儲軟體便於使用SQL讀取、寫入和管理駐留在分散式儲存中的大型資料集。結構可以投射到已儲存的資料上。提供了一個命令列工具和JDBC驅動程式,用於將使用者連線到Hive。

Hive引擎允許您對HDFS設定單元表執行SELECT查詢。目前支援如下輸入格式:

  • 文字:僅支援簡單標量列型別,二進位制除外;
  • ORC:支援除char以外的簡單標量列型別;僅支援陣列等複雜型別;
  • parquet:支援所有簡單的標量列型別;僅支援陣列等複雜型別。

正文

建立Hive引擎表詳細資訊以及引數詳解

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]  
(  
name1 [type1] [ALIAS expr1],  
name2 [type2] [ALIAS expr2],  
...  
) ENGINE = Hive('thrift://host:port', 'database', 'table');  
PARTITION BY expr

表結構可以與原始設定單元表結構不同:

  • 列名應該與原始設定單元表中的列名相同(推薦列名相同處理),但您可以只使用其中的一些列,並且可以按任何順序使用,也可以使用從其他列計算的一些別名列。
  • 列型別應與原始設定單元表中的列型別相同
  • 按表示式劃分應該與原始Hive表一致,按表示式劃分中的列應該在表結構中。

引擎引數:

  • thrift://host:port-設定單元元儲存地址
  • database—遠端資料庫名稱。
  • table—遠端表名稱。

實戰案例

為遠端檔案系統啟用本地快取。通過官方的基準測試表明,使用快取的速度快了近兩倍。在使用快取之前,將其新增到config.xml

<local_cache_for_remote_fs>
    <enable>true</enable>
    <root_dir>local_cache</root_dir>
    <limit_size>559096952</limit_size>
    <bytes_read_before_flush>1048576</bytes_read_before_flush>
</local_cache_for_remote_fs>

引數詳解:

  • enable:ClickHouse將在啟動後維護遠端檔案系統(HDFS)的本地快取(如果為true)。
  • root_dir:必需。用於儲存遠端檔案系統的本地快取檔案的根目錄。
  • limit_size:必填。本地快取檔案的最大大小(位元組)。
  • bytes_read_before_flush:從遠端檔案系統下載檔案時,在重新整理到本地檔案系統之前控制位元組數。預設值為1MB。

儘管ClickHouse在啟用遠端檔案系統本地快取的情況下啟動時,我們仍然可以選擇不使用其查詢中設定為use_local_cache_for_remote_fs=0的快取。use_local_cache_for_remote_fs預設為false

ORC資料格式

  • Hive建立ORC資料格式表
CREATE TABLE `test`.`test_orc`(  
`f_tinyint` tinyint,  
`f_smallint` smallint,  
`f_int` int,  
`f_integer` int,  
`f_bigint` bigint,  
`f_float` float,  
`f_double` double,  
`f_decimal` decimal(10,0),  
`f_timestamp` timestamp,  
`f_date` date,  
`f_string` string,  
`f_varchar` varchar(100),  
`f_bool` boolean,  
`f_binary` binary,  
`f_array_int` array<int>,  
`f_array_string` array<string>,  
`f_array_float` array<float>,  
`f_array_array_int` array<array<int>>,  
`f_array_array_string` array<array<string>>,  
`f_array_array_float` array<array<float>>)  
PARTITIONED BY (  
`day` string)  
ROW FORMAT SERDE  
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'  
STORED AS INPUTFORMAT  
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'  
OUTPUTFORMAT  
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'  
LOCATION  
'hdfs://testcluster/data/hive/test.db/test_orc'
insert into test.test_orc partition(day='2021-09-18') select 1, 2, 3, 4, 5, 6.11, 7.22, 8.333, current_timestamp(), current_date(), 'hello world', 'hello world', 'hello world', true, 'hello world', array(1, 2, 3), array('hello world', 'hello world'), array(float(1.1), float(1.2)), array(array(1, 2), array(3, 4)), array(array('a', 'b'), array('c', 'd')), array(array(float(1.11), float(2.22)), array(float(3.33), float(4.44)));
  • Clickhouse建立Hive表引擎
CREATE TABLE test.test_orc
(
    `f_tinyint` Int8,
    `f_smallint` Int16,
    `f_int` Int32,
    `f_integer` Int32,
    `f_bigint` Int64,
    `f_float` Float32,
    `f_double` Float64,
    `f_decimal` Float64,
    `f_timestamp` DateTime,
    `f_date` Date,
    `f_string` String,
    `f_varchar` String,
    `f_bool` Bool,
    `f_binary` String,
    `f_array_int` Array(Int32),
    `f_array_string` Array(String),
    `f_array_float` Array(Float32),
    `f_array_array_int` Array(Array(Int32)),
    `f_array_array_string` Array(Array(String)),
    `f_array_array_float` Array(Array(Float32)),
    `day` String
)
ENGINE = Hive('thrift://202.168.117.26:9083', 'test', 'test_orc')
PARTITION BY day
  • 通過Clickhouse查詢Hive資料
SELECT * FROM test.test_orc settings input_format_orc_allow_missing_columns = 1G

Parquet資料格式

  • Hive建立Parquet資料格式表
CREATE TABLE `test`.`test_parquet`(  
`f_tinyint` tinyint,  
`f_smallint` smallint,  
`f_int` int,  
`f_integer` int,  
`f_bigint` bigint,  
`f_float` float,  
`f_double` double,  
`f_decimal` decimal(10,0),  
`f_timestamp` timestamp,  
`f_date` date,  
`f_string` string,  
`f_varchar` varchar(100),  
`f_char` char(100),  
`f_bool` boolean,  
`f_binary` binary,  
`f_array_int` array<int>,  
`f_array_string` array<string>,  
`f_array_float` array<float>,  
`f_array_array_int` array<array<int>>,  
`f_array_array_string` array<array<string>>,  
`f_array_array_float` array<array<float>>)  
PARTITIONED BY (  
`day` string)  
ROW FORMAT SERDE  
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'  
STORED AS INPUTFORMAT  
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'  
OUTPUTFORMAT  
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'  
LOCATION  
'hdfs://testcluster/data/hive/test.db/test_parquet'
insert into test.test_parquet partition(day='2021-09-18') select 1, 2, 3, 4, 5, 6.11, 7.22, 8.333, current_timestamp(), current_date(), 'hello world', 'hello world', 'hello world', true, 'hello world', array(1, 2, 3), array('hello world', 'hello world'), array(float(1.1), float(1.2)), array(array(1, 2), array(3, 4)), array(array('a', 'b'), array('c', 'd')), array(array(float(1.11), float(2.22)), array(float(3.33), float(4.44)));
  • Clickhouse建立Hive表引擎
CREATE TABLE test.test_parquet  
(  
`f_tinyint` Int8,  
`f_smallint` Int16,  
`f_int` Int32,  
`f_integer` Int32,  
`f_bigint` Int64,  
`f_float` Float32,  
`f_double` Float64,  
`f_decimal` Float64,  
`f_timestamp` DateTime,  
`f_date` Date,  
`f_string` String,  
`f_varchar` String,  
`f_char` String,  
`f_bool` Bool,  
`f_binary` String,  
`f_array_int` Array(Int32),  
`f_array_string` Array(String),  
`f_array_float` Array(Float32),  
`f_array_array_int` Array(Array(Int32)),  
`f_array_array_string` Array(Array(String)),  
`f_array_array_float` Array(Array(Float32)),  
`day` String  
)  
ENGINE = Hive('thrift://localhost:9083', 'test', 'test_parquet')  
PARTITION BY day
  • 通過Clickhouse查詢Hive資料
SELECT * FROM test.test_parquet settings input_format_parquet_allow_missing_columns = 1G

TextFile資料格式

  • Hive建立TextFile資料格式表
CREATE TABLE `test`.`test_text`(  
`f_tinyint` tinyint,  
`f_smallint` smallint,  
`f_int` int,  
`f_integer` int,  
`f_bigint` bigint,  
`f_float` float,  
`f_double` double,  
`f_decimal` decimal(10,0),  
`f_timestamp` timestamp,  
`f_date` date,  
`f_string` string,  
`f_varchar` varchar(100),  
`f_char` char(100),  
`f_bool` boolean,  
`f_binary` binary,  
`f_array_int` array<int>,  
`f_array_string` array<string>,  
`f_array_float` array<float>,  
`f_array_array_int` array<array<int>>,  
`f_array_array_string` array<array<string>>,  
`f_array_array_float` array<array<float>>)  
PARTITIONED BY (  
`day` string)  
ROW FORMAT SERDE  
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'  
STORED AS INPUTFORMAT  
'org.apache.hadoop.mapred.TextInputFormat'  
OUTPUTFORMAT  
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'  
LOCATION  
'hdfs://testcluster/data/hive/test.db/test_text'
insert into test.test_text partition(day='2021-09-18') select 1, 2, 3, 4, 5, 6.11, 7.22, 8.333, current_timestamp(), current_date(), 'hello world', 'hello world', 'hello world', true, 'hello world', array(1, 2, 3), array('hello world', 'hello world'), array(float(1.1), float(1.2)), array(array(1, 2), array(3, 4)), array(array('a', 'b'), array('c', 'd')), array(array(float(1.11), float(2.22)), array(float(3.33), float(4.44)));
  • Clickhouse建立Hive表引擎
CREATE TABLE test.test_text  
(  
`f_tinyint` Int8,  
`f_smallint` Int16,  
`f_int` Int32,  
`f_integer` Int32,  
`f_bigint` Int64,  
`f_float` Float32,  
`f_double` Float64,  
`f_decimal` Float64,  
`f_timestamp` DateTime,  
`f_date` Date,  
`f_string` String,  
`f_varchar` String,  
`f_char` String,  
`f_bool` Bool,  
`day` String  
)  
ENGINE = Hive('thrift://localhost:9083', 'test', 'test_text')  
PARTITION BY day
  • 通過Clickhouse查詢Hive資料
SELECT * FROM test.test_text settings input_format_skip_unknown_fields = 1, input_format_with_names_use_header = 1, date_time_input_format = 'best_effort'G

總結

本節主要講解了Clickhouse整合Hive數倉,利用了Hive引擎並通過thrift方式去連線,需要注意這種連線引數的設定以及代表意義。另外,這個過程我們需要注意的是,推薦開啟快取,這樣查詢速度會快很多。與此同時,也對Hive常用的三種資料型別ORC,Parquet,TextFile進行了一個實戰案例操作,更多關於Clickhouse整合Hive資料倉儲的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com