Hive connector功能性文檔
Trino需要使用Hive下的 元數(shù)據(jù)服務(wù)(HMS)和對(duì)象存儲(chǔ)系統(tǒng)(HDFS),協(xié)調(diào)器和所有的工作機(jī)需要和他們是保證網(wǎng)絡(luò)暢通。
該連接器提供對(duì)配置的對(duì)象存儲(chǔ)系統(tǒng)和元數(shù)據(jù)存儲(chǔ)中的數(shù)據(jù)和元數(shù)據(jù)的讀取訪問和寫入訪問:
- 全局可用語句
- 讀操作
- 寫操作
- 安全操作
- 事務(wù)
SQL語言上的支持
基礎(chǔ)使用案例
創(chuàng)建內(nèi)部表
在catalog為hive下名為testdb的schema中創(chuàng)建一個(gè)名為page_views的Hive表,該表使用ORC文件格式存儲(chǔ),按ds和country進(jìn)行分區(qū),并按用戶分成50個(gè)桶。注意,Hive要求分區(qū)列是表中的最后一列:
CREATE TABLE hive.testdb.page_views (
view_time timestamp,
user_id bigint,
page_url varchar,
ds date,
country varchar
)
WITH (
format = 'ORC',
partitioned_by = ARRAY['ds', 'country'],
bucketed_by = ARRAY['user_id'],
bucket_count = 50
)
創(chuàng)建庫
創(chuàng)建一個(gè)新的名為web的Hive schema,將表存儲(chǔ)在S3下一個(gè)名為my-bucket的路徑中,with用來指定location。
CREATE SCHEMA hive.web
WITH (location = 's3://my-bucket/')
刪除庫
刪除schema
DROP SCHEMA example.web
新增分區(qū)
CALL hive.system.create_empty_partition(
schema_name => 'testdb',
table_name => 'page_views',
partition_columns => ARRAY['ds', 'country'],
partition_values => ARRAY['2023-05-26', 'CN']);
查詢表中的分區(qū)列表
SELECT * FROM hive.testdb."page_views$partitions"
刪除分區(qū)
刪除表中的一個(gè)分區(qū)
DELETE FROM hive.testdb.page_views
WHERE ds = DATE '2023-05-26'
AND country = 'CN'
全表查詢
SELECT * FROM hive.testdb.page_views
創(chuàng)建外部表
創(chuàng)建一個(gè)名為request_logs的外部Hive表,指向S3中的現(xiàn)有數(shù)據(jù):
CREATE TABLE example.web.request_logs (
request_time timestamp,
url varchar,
ip varchar,
user_agent varchar
)
WITH (
format = 'TEXTFILE',
external_location = 's3://my-bucket/data/logs/'
)
分析表
收集request_logs表的統(tǒng)計(jì)數(shù)據(jù):
ANALYZE hive.testdb.page_views
ANALYZE hive.testdb.page_views WITH (partitions = ARRAY[ARRAY['2023-05-26','CN']]);
刪除外部表
刪除外部表 request_logs。這只是刪除了該表的元數(shù)據(jù)。被引用的數(shù)據(jù)目錄不會(huì)被刪除:
DROP TABLE example.web.request_logs
創(chuàng)建事務(wù)表
CREATE TABLE AS可以用來創(chuàng)建ORC格式的事務(wù)表,像這樣:
CREATE TABLE <name>
WITH (
format='ORC',
transactional=true
)
AS <query>
刪除page_views表的一個(gè)分區(qū)的統(tǒng)計(jì)信息
刪除page_views表的一個(gè)分區(qū)的統(tǒng)計(jì)信息:
CALL hive.system.drop_stats(
schema_name => 'testdb',
table_name => 'page_views',
partition_values => ARRAY[ARRAY['2023-05-26', 'CN']]);
程序
使用CALL語句來執(zhí)行數(shù)據(jù)操作或管理任務(wù)。如果你的Hive catalog被稱為web,那么程序必須包括一個(gè)合格的catalog名稱:
CALL web.system.example_procedure()
有以下程序可供選擇:
-
system.create_empty_partition(schema_name, table_name, partition_columns, partition_values)
:在指定的表中創(chuàng)建一個(gè)空分區(qū)。 -
system.sync_partition_metadata(schema_name, table_name, mode, case_sensitive)
:檢查和更新元存儲(chǔ)中的分區(qū)列表。有三種模式可供選擇:-
ADD
:添加任何存在于文件系統(tǒng)中,但不在元存儲(chǔ)中的分區(qū)。 -
DROP
:丟棄任何存在于元存儲(chǔ)中,但不存在于文件系統(tǒng)中的分區(qū)。 -
FULL
:同時(shí)執(zhí)行ADD和DROP。
參數(shù)
case_sensitive
是可選的。為了與Hive的MSCK REPAIR TABLE行為兼容,默認(rèn)值為true
,它希望文件系統(tǒng)路徑中的分區(qū)列名使用小寫(例如col_x=SomeValue
)。文件系統(tǒng)中不符合這一慣例的分區(qū)會(huì)被忽略,除非該參數(shù)被設(shè)置為false
。 -
-
system.drop_stats(schema_name, table_name, partition_values)
:丟棄一個(gè)分區(qū)子集或整個(gè)表的統(tǒng)計(jì)數(shù)據(jù)。分區(qū)被指定為一個(gè)數(shù)組,其元素是分區(qū)值的數(shù)組(類似于create_empty_partition中的partition_values參數(shù))。如果省略了partition_values參數(shù),則會(huì)放棄整個(gè)表的統(tǒng)計(jì)信息。 -
system.register_partition(schema_name, table_name, partition_columns, partition_values, location)
:將現(xiàn)有的位置注冊(cè)為指定表的元存儲(chǔ)中的一個(gè)新分區(qū)。
當(dāng)省略location參數(shù)時(shí),分區(qū)位置是使用
partition_columns
和partition_values
構(gòu)建的。由于安全原因,只有當(dāng)
hive.allow-register-partition-procedure
被設(shè)置為true
時(shí),該程序才會(huì)被啟用。 -
system.unregister_partition(schema_name, table_name, partition_columns, partition_values)
:在元存儲(chǔ)中為指定的表取消注冊(cè)現(xiàn)有的分區(qū)。分區(qū)數(shù)據(jù)不被刪除。 -
system.flush_metadata_cache()
:刷新所有的Hive元數(shù)據(jù)緩存。 -
system.flush_metadata_cache(schema_name => ..., table_name => ...)
:刷新與選定表相關(guān)的Hive元數(shù)據(jù)緩存條目。該過程需要傳遞命名的參數(shù) -
system.flush_metadata_cache(schema_name => ..., table_name => ..., partition_columns => ARRAY[...], partition_values => ARRAY[...])
:刷新與選定分區(qū)相關(guān)的Hive元數(shù)據(jù)緩存條目。該過程需要傳遞命名參數(shù)。
數(shù)據(jù)管理
一些數(shù)據(jù)管理語句可能會(huì)受到Hive目錄的授權(quán)檢查策略的影響。在默認(rèn)的傳統(tǒng)策略中,一些語句被默認(rèn)禁用。更多信息請(qǐng)參見Hive連接器安全配置。
數(shù)據(jù)管理功能包括對(duì)INSERT
、UPDATE
、DELETE
和MERGE
語句的支持,具體支持情況取決于存儲(chǔ)系統(tǒng)、文件格式和元存儲(chǔ)。
當(dāng)連接到3.x版本的Hive元存儲(chǔ)時(shí),Hive連接器支持從只寫表和ACID表中讀取和寫入,并完全支持分區(qū)和分桶。
DELETE:只有當(dāng)表被分區(qū)且WHERE
子句匹配整個(gè)分區(qū)時(shí),才支持應(yīng)用于非事務(wù)表的DELETE。具有ORC格式的事務(wù)型Hive表支持 "逐行 "刪除,其中的WHERE子句可以匹配任意的行集。
UPDATE:只有格式為ORC的事務(wù)性Hive表才支持UPDATE。不支持分區(qū)或桶列的UPDATE。
MERGE:只支持ACID表。
不支持使用Hive Streaming Ingest(Hive 3)創(chuàng)建的ACID表。
Schema與表管理
Hive連接器支持查詢和操作Hive表和模式(數(shù)據(jù)庫)。雖然有些不常見的操作必須直接使用Hive進(jìn)行,但大多數(shù)操作都可以使用Trino進(jìn)行。
模式演化
Hive允許一個(gè)表中的分區(qū)擁有與表不同的模式。當(dāng)一個(gè)表的列類型在分區(qū)已經(jīng)存在(使用原來的列類型)之后被改變時(shí),就會(huì)出現(xiàn)這種情況。Hive連接器通過允許與Hive相同的轉(zhuǎn)換來支持這種情況:
-
varchar
與tinyint
、smallint
、integer
和bigint
之間的轉(zhuǎn)換 -
real
todouble
-
整數(shù)的擴(kuò)展轉(zhuǎn)換,比如
tinyint
到smallint
任何轉(zhuǎn)換失敗的結(jié)果都是null,這與Hive的行為相同。例如,將字符串’foo’轉(zhuǎn)換為數(shù)字,或者將字符串’1234’轉(zhuǎn)換為tinyint(其最大值為127)。
Avro模式的演變
Trino支持查詢和操作具有Avro存儲(chǔ)格式的Hive表,它的模式設(shè)置是基于Avro模式file/literal。Trino也能夠通過從位于本地或遠(yuǎn)程HDFS/Web服務(wù)器中的有效Avro模式文件推斷出模式,從而在Trino中創(chuàng)建表。
要指定Avro模式應(yīng)該被用來解釋表數(shù)據(jù),請(qǐng)使用avro_schema_url
表屬性。
模式可以放在本地文件系統(tǒng)中,也可以遠(yuǎn)程放在以下位置:
-
HDFS(例如,
avro_schema_url = 'hdfs://user/avro/schema/avro_data.avsc'
) -
S3(例如,
avro_schema_url = 's3n:///schema_bucket/schema/avro_data.avsc'
) -
一個(gè)網(wǎng)絡(luò)服務(wù)器(例如,
avro_schema_url = 'http://example.org/schema/avro_data.avsc'
)。
模式所在的URL必須能夠從Hive元存儲(chǔ)和Trino協(xié)調(diào)器/工作節(jié)點(diǎn)中訪問。
另外,你也可以使用表屬性avro_schema_literal
來定義Avro模式。
在Trino中使用avro_schema_url
或avro_schema_literal
屬性創(chuàng)建的表與設(shè)置了avro.schema.url
或avro.schema.literal
的Hive表的行為方式相同。
例子:
CREATE TABLE example.avro.avro_data (
id bigint
)
WITH (
format = 'AVRO',
avro_schema_url = '/usr/local/avro_data.avsc'
)
如果指定了avro_schema_url
,那么在DDL中列出的列(上面例子中的id
)將被忽略。表的模式與Avro模式文件中的模式相匹配。在任何讀取操作之前,Avro模式被訪問,所以查詢結(jié)果反映了模式的任何變化。因此,Trino利用了Avro的后向兼容能力。
如果表的模式在Avro模式文件中發(fā)生變化,新的模式仍然可以用來讀取舊的數(shù)據(jù)。新添加/重命名的字段在Avro模式文件中必須有一個(gè)默認(rèn)值。
架構(gòu)演變行為如下:
-
在新模式中添加的列: 當(dāng)表使用新模式時(shí),用舊模式創(chuàng)建的數(shù)據(jù)產(chǎn)生一個(gè)默認(rèn)值。
-
在新模式中刪除列: 用舊模式創(chuàng)建的數(shù)據(jù)不再輸出被移除的列的數(shù)據(jù)。
-
列在新模式中被重新命名: 這相當(dāng)于刪除列并添加一個(gè)新的列,當(dāng)表使用新模式時(shí),用舊模式創(chuàng)建的數(shù)據(jù)產(chǎn)生一個(gè)默認(rèn)值。
-
在新的模式中改變列的類型: 如果Avro或Hive連接器支持類型強(qiáng)制,那么就會(huì)進(jìn)行轉(zhuǎn)換。對(duì)于不兼容的類型,會(huì)產(chǎn)生一個(gè)錯(cuò)誤。
限制條件
當(dāng)avro_schema_url
被設(shè)置時(shí),以下操作不被支持:
- 不支持
CREATE TABLE AS
。 - CREATE TABLE中不支持Bucketing(
bucketed_by
)列。 - 不支持修改列的
ALTER TABLE
命令。
ALTER TABLE EXECUTE
連接器支持與ALTER TABLE EXECUTE一起使用的優(yōu)化命令。
優(yōu)化命令用于重寫指定的非事務(wù)表的內(nèi)容,以便將其合并為更少但更大的文件。如果表是分區(qū)的,數(shù)據(jù)壓縮將分別作用于為優(yōu)化而選擇的每個(gè)分區(qū)。這個(gè)操作提高了讀取性能。
所有大小低于可選的file_size_threshold
參數(shù)(閾值的默認(rèn)值是100MB)的文件被合并:
ALTER TABLE test_table EXECUTE optimize
下面的語句合并了表內(nèi)大小在10兆字節(jié)以下的文件:
ALTER TABLE test_table EXECUTE optimize(file_size_threshold => '10MB')
你可以使用一個(gè)WHERE子句,用用于分區(qū)表的列,來過濾哪些分區(qū)被優(yōu)化:
ALTER TABLE test_partitioned_table EXECUTE optimize
WHERE partition_key = 1
優(yōu)化命令默認(rèn)是禁用的,可以通過<catalog-name>.non_transactional_optimize_enabled
會(huì)話屬性為一個(gè)目錄啟用:
SET SESSION <catalog_name>.non_transactional_optimize_enabled=true
由于Hive表是非事務(wù)性的,請(qǐng)注意以下可能的結(jié)果:
如果對(duì)當(dāng)前正在優(yōu)化的表運(yùn)行查詢,可能會(huì)讀取重復(fù)的行。
在極少數(shù)情況下,在
optimize
操作過程中出現(xiàn)異常,需要手動(dòng)清理表的目錄。在這種情況下,參考Trino日志和查詢失敗信息,看看哪些文件必須被刪除。
表屬性
表屬性為底層表提供或設(shè)置元數(shù)據(jù)。這是CREATE TABLE AS語句的關(guān)鍵。表的屬性是通過WITH子句傳遞給連接器的:
CREATE TABLE tablename
WITH (format='CSV',
csv_escape = '"')
Hive connector table properties
Property name | Description | Default |
---|---|---|
auto_purge |
指示配置的元存儲(chǔ)在刪除表或分區(qū)時(shí)執(zhí)行清除,而不是使用回收站進(jìn)行軟刪除。 | |
avro_schema_url |
指向表的Avro schema evolution的URI。 | |
bucket_count |
數(shù)據(jù)分組的桶的數(shù)量。只在與bucketed_by 一起使用時(shí)有效。 |
0 |
bucketed_by |
存儲(chǔ)表的bucketing列。只在與bucket_count 一起使用時(shí)有效。 |
[] |
bucketing_version |
指定使用哪一個(gè)Hive bucketing版本。有效值是1 或2 。 |
|
csv_escape |
CSV轉(zhuǎn)義字符. Requires CSV format. | |
csv_quote |
CSV引號(hào)字符. Requires CSV format. | |
csv_separator |
CSV的分隔符。要求是CSV格式。你可以使用其他分隔符,如` |
,或使用Unicode配置隱形分隔符,如用 U&‘\0009’`的標(biāo)簽。 |
external_location |
S3、Azure Blob存儲(chǔ)等的外部Hive表的URI。 See the Basic usage examples for more information. | |
format |
表的文件格式。有效值包括ORC , PARQUET , AVRO , RCBINARY , RCTEXT , SEQUENCEFILE , JSON , TEXTFILE , CSV , 和 REGEX 。目錄屬性hive.storage-format 設(shè)置了默認(rèn)值,可以將其改為不同的默認(rèn)值。 |
|
null_format |
`NULL’值的序列化格式。需要TextFile, RCText, 或SequenceFile格式。 | |
orc_bloom_filter_columns |
逗號(hào)分隔的列列表,用于ORC bloom過濾器。它提高了讀取ORC文件時(shí)使用范圍謂詞的查詢性能。Requires ORC format. | [] |
orc_bloom_filter_fpp |
The ORC bloom filters false positive probability. Requires ORC format. | 0.05 |
partitioned_by |
存儲(chǔ)表的分區(qū)列。在partitioned_by 子句中列出的列必須是DDL中定義的最后一列。 |
[] |
skip_footer_line_count |
在解析文件的數(shù)據(jù)時(shí)要忽略的頁腳行數(shù)。 Requires TextFile or CSV format tables. | |
skip_header_line_count |
在解析文件的數(shù)據(jù)時(shí)要忽略的標(biāo)題行數(shù)。 Requires TextFile or CSV format tables. | |
sorted_by |
要排序的列,以確定行的bucketing。只有在指定了bucketed_by 和bucket_count 時(shí)才有效。 |
[] |
textfile_field_separator |
允許對(duì)TextFile格式的表格使用自定義字段分隔符,如’|'。 | |
textfile_field_separator_escape |
允許對(duì)TextFile格式的表格使用自定義轉(zhuǎn)義字符。 | |
transactional |
將此屬性設(shè)置為true 以創(chuàng)建一個(gè)ORC ACID事務(wù)表。Requires ORC format. 對(duì)于使用舊版本的Hive創(chuàng)建的僅供插入的表,該屬性可能顯示為true。 |
|
partition_projection_enabled |
啟用所選表的分區(qū)投影。從AWS Athena表屬性projection.enabled映射過來。 | |
partition_projection_ignore |
忽略任何存儲(chǔ)在元存儲(chǔ)中的選定表的分區(qū)投影屬性。這是一個(gè)Trino專用的屬性,允許你在特定的表上解決兼容性問題,如果啟用,Trino會(huì)忽略所有其他與分區(qū)投影有關(guān)的配置選項(xiàng)。 | |
partition_projection_location_template |
預(yù)測(cè)的分區(qū)位置模板,如s3a://test/name=${name}/ 。從AWS Athena表屬性storage.location.template中映射出來 |
${table_location}/${partition_name} |
extra_properties |
添加到Hive表中的額外屬性。這些屬性不被Trino使用,可以在$properties 元數(shù)據(jù)表中找到。這些屬性不包括在SHOW CREATE TABLE 語句的輸出中。 |
Metadata tables
原始的Hive表屬性可以作為一個(gè)隱藏的表,每個(gè)表屬性包含一個(gè)單獨(dú)的列,單行包含屬性值。屬性表的名稱與附加了$properties的表的名稱相同。
你可以用一個(gè)簡(jiǎn)單的查詢來檢查屬性名稱和值:
SELECT * FROM hive.testdb."page_views$properties";
Column properties
Hive connector column properties
Property name | Description | Default |
---|---|---|
partition_projection_type |
定義在此列上使用的分區(qū)投影的類型。只可以在分區(qū)列上使用??捎玫念愋停?enum , integer , date , injected . 從AWS Athena表屬性projection.${columnName}.type映射過來。 |
|
partition_projection_values |
與partition_projection_type 設(shè)置為ENUM 一起使用。包含一個(gè)用于生成分區(qū)的靜態(tài)值列表。從AWS Athena表屬性projection.${columnName}.values映射過來。 |
|
partition_projection_range |
與partition_projection_type 設(shè)置為INTEGER 或DATE 一起使用,定義一個(gè)范圍。它是一個(gè)雙元素?cái)?shù)組,描述了用于生成分區(qū)的最小和最大范圍值。生成從最小值開始,然后通過定義的partition_projection_interval 遞增到最大值。例如,對(duì)于 “partition_projection_type “的 “INTEGER”,格式是”[‘1’, ‘4’]”;對(duì)于 “partition_projection_type “的 “DATE”,格式是”[‘2001-01-01’, ‘2001-01-07’]“或”`NOW-3DAYS’, ‘NOW’”。從AWS Athena表屬性projection.${columnName}.range映射出來。 |
|
partition_projection_interval |
與partition_projection_type 設(shè)置為INTEGER 或DATE 一起使用。它表示用于在給定范圍partition_projection_range 內(nèi)生成分區(qū)的時(shí)間間隔。從AWS Athena表屬性projection.${columnName}.interval映射過來。 |
|
partition_projection_digits |
與partition_projection_type 設(shè)置為INTEGER 一起使用。整數(shù)列投影要使用的數(shù)字。從AWS Athena表屬性projection.${columnName}.digits映射過來。 |
|
partition_projection_format |
在partition_projection_type 設(shè)置為DATE 時(shí)使用。日期列的投影格式,定義為字符串,如yyyy MM 或MM-dd-yy HH:mm:ss ,用于Java DateTimeFormatter類。從AWS Athena表屬性projection.${columnName}.format映射過來。 |
|
partition_projection_interval_unit |
與partition_projection_type=DATA 一起使用。partition_projection_interval 中給出的日期列投影范圍間隔單位。從AWS Athena表屬性projection.${columnName}.interval.unit映射過來。 |
Metadata columns
除了定義的列之外,Hive連接器還在每個(gè)表中的一些隱藏列中主動(dòng)展示元數(shù)據(jù):
-
$bucket
: 該行的桶號(hào) -
$path
: 該行的文件的完整文件系統(tǒng)路徑名稱 -
$file_modified_time
: 這一行的文件最后修改的日期和時(shí)間 -
$file_size
: 這一行的文件大小 -
$partition
: 此行的分區(qū)名稱
你可以像其他列一樣在你的SQL語句中使用這些列。它們可以被直接選擇,或在條件語句中使用。例如,你可以檢查每條記錄的文件大小、位置和分區(qū):
SELECT *, "$path", "$file_size", "$partition"
FROM hive.testdb.page_views;
檢索屬于存儲(chǔ)在分區(qū)ds=2016-08-09/country=US
中的文件的所有記錄:
SELECT *, "$path", "$file_size"
FROM hive.testdb.page_views
WHERE "$partition" = 'ds=2023-05-26/country=CN'
視圖管理
Trino允許從Hive物化視圖中讀取數(shù)據(jù),并且可以配置為支持讀取Hive視圖。
物化視圖
Hive連接器支持從Hive物化視圖中讀取數(shù)據(jù)。在Trino中,這些視圖是作為普通的、只讀的表呈現(xiàn)的。
Hive視圖
Hive視圖在HiveQL中定義,并存儲(chǔ)在Hive Metastore服務(wù)中。它們被分析為允許對(duì)數(shù)據(jù)進(jìn)行讀取訪問。
Hive連接器包括支持以三種不同的模式來讀取Hive視圖。
- Disabled
- Legacy
- Experimental
可以在目錄屬性文件中配置該行為。
默認(rèn)情況下,Hive視圖是以RUN AS DEFINER安全模式執(zhí)行的。將hive.hive-views.run-as-invoker
目錄配置屬性設(shè)置為true,以使用RUN AS INVOKER語義。
Disabled
默認(rèn)行為是忽略Hive視圖。這意味著你在視圖中編碼的業(yè)務(wù)邏輯和數(shù)據(jù)在Trino中是不可用的。
Legacy
可以用hive.hive-views.enabled=true
和hive.hive-views.legacy-translation=true
啟用一個(gè)非常簡(jiǎn)單的實(shí)現(xiàn)來執(zhí)行Hive視圖,從而允許在Trino中讀取數(shù)據(jù)。
對(duì)于臨時(shí)使用特定目錄的遺留行為,你可以將hive_views_legacy_translation
目錄會(huì)話屬性設(shè)置為true
。
該傳統(tǒng)行為將任何定義視圖的HiveQL查詢解釋為用SQL編寫。它不做任何翻譯,而是依賴于HiveQL與SQL非常相似的事實(shí)。
這對(duì)于非常簡(jiǎn)單的Hive視圖來說是可行的,但對(duì)于更復(fù)雜的查詢來說可能會(huì)導(dǎo)致問題。例如,如果一個(gè)HiveQL函數(shù)有相同的簽名,但與SQL版本有不同的行為,那么返回的結(jié)果可能會(huì)有所不同。在更極端的情況下,查詢可能會(huì)失敗,甚至不能被解析和執(zhí)行。
Experimental
新的行為被設(shè)計(jì)得更好,并有可能變得比傳統(tǒng)的實(shí)現(xiàn)更強(qiáng)大。它可以分析、處理和重寫Hive視圖以及包含的表達(dá)式和語句。
它支持以下Hive視圖功能:
-
針對(duì)Hive視圖的UNION [DISTINCT] 和 UNION ALL
-
嵌套的GROUP BY條款
-
current_user()
-
LATERAL VIEW OUTER EXPLODE
-
LATERAL VIEW [OUTER] EXPLODE
on array of struct -
LATERAL VIEW json_tuple
你可以用hive.hive-views.enabled=true
來啟用實(shí)驗(yàn)性行為。刪除hive.hive-views.legacy-translation
屬性或?qū)⑵湓O(shè)置為false
以確保legacy不被啟用。
在試驗(yàn)這一功能時(shí),請(qǐng)記住,許多功能尚未實(shí)現(xiàn)。以下是一個(gè)不完整的缺失功能列表:
-
HiveQL的current_date、current_timestamp及其他
-
Hive函數(shù)調(diào)用,包括translate()、窗口函數(shù)等
-
常見的表格表達(dá)式和簡(jiǎn)單的案例表達(dá)式
-
時(shí)間戳的精度設(shè)置
-
支持所有的Hive數(shù)據(jù)類型以及與Trino類型的正確映射
-
能夠處理自定義的UDFs
Trino SQL與HiveQL上的不同
Trino使用ANSI SQL的語法和語義,而Hive使用一種類似于SQL的語言,稱為HiveQL,它是松散地仿照MySQL(它本身與ANSI SQL有許多不同之處)。
使用下標(biāo)來訪問一個(gè)數(shù)組的動(dòng)態(tài)索引,而不是使用udf
SQL中的下標(biāo)運(yùn)算符支持完整的表達(dá)式,而不像Hive(只支持常量)。因此,你可以寫這樣的查詢:
SELECT my_array[CARDINALITY(my_array)] as last_element
FROM ...
避免數(shù)組的越界訪問
訪問數(shù)組中的界外元素將導(dǎo)致一個(gè)異常。你可以用一個(gè)if來避免這種情況,如下所示
SELECT IF(CARDINALITY(my_array) >= 3, my_array[3], NULL)
FROM ...
對(duì)數(shù)組使用ANSI SQL語法
數(shù)組的索引是從1開始的,而不是從0開始
SELECT my_array[1] AS first_element
FROM ...
用ANSI語法構(gòu)造數(shù)組:
SELECT ARRAY[1, 2, 3] AS my_array
對(duì)標(biāo)識(shí)符和字符串使用ANSI SQL語法
字符串用單引號(hào)分隔,標(biāo)識(shí)符用雙引號(hào)引出,而不是反引號(hào):
SELECT name AS "User Name"
FROM "7day_active"
WHERE name = 'foo'
以數(shù)字開頭的報(bào)價(jià)標(biāo)識(shí)符
在ANSI SQL中,以數(shù)字開頭的標(biāo)識(shí)符是不合法的,必須使用雙引號(hào)進(jìn)行引用:
SELECT *
FROM "7day_active"
使用標(biāo)準(zhǔn)的字符串連接操作符
使用ANSI SQL的字符串連接操作符:
SELECT a || b || c
FROM ...
對(duì)CAST目標(biāo)使用標(biāo)準(zhǔn)類型
CAST目標(biāo)支持以下標(biāo)準(zhǔn)類型:
SELECT
CAST(x AS varchar)
, CAST(x AS bigint)
, CAST(x AS double)
, CAST(x AS boolean)
FROM ...
特別是,使用VARCHAR而不是STRING。
整數(shù)除法時(shí)使用 CAST
Trino在除以兩個(gè)整數(shù)時(shí)遵循執(zhí)行整數(shù)除法的標(biāo)準(zhǔn)行為。例如,7除以2的結(jié)果是3,而不是3.5。要對(duì)兩個(gè)整數(shù)進(jìn)行浮點(diǎn)除法,應(yīng)將其中一個(gè)整數(shù)投給一個(gè)雙數(shù):
SELECT CAST(5 AS DOUBLE) / 2
對(duì)復(fù)雜的表達(dá)式或查詢使用 WITH
當(dāng)你想重新使用一個(gè)復(fù)雜的輸出表達(dá)式作為過濾器時(shí),可以使用內(nèi)聯(lián)子查詢或使用WITH子句將其分解:
WITH a AS (
SELECT substr(name, 1, 3) x
FROM ...
)
SELECT *
FROM a
WHERE x = 'foo'
使用UNNEST來擴(kuò)展數(shù)組和集合
Trino支持UNNEST來擴(kuò)展數(shù)組和集合。使用UNNEST而不是LATERAL VIEW explode()。
Hive query:
SELECT student, score
FROM tests
LATERAL VIEW explode(scores) t AS score;
Trino query:
SELECT student, score
FROM tests
CROSS JOIN UNNEST(scores) AS t (score);
對(duì)日期和時(shí)間的INTERVAL表達(dá)式使用ANSI SQL語法
Trino支持ANSI SQL風(fēng)格的INTERVAL表達(dá)式,與Hive中使用的實(shí)現(xiàn)方式不同。
-
INTERVAL關(guān)鍵字是必須的,不是可有可無的。
-
日期和時(shí)間單位必須是單數(shù)。例如day,而不是days。
-
值必須有引號(hào)。
Hive查詢:
SELECT cast('2000-08-19' as date) + 14 days;
等效的Trino查詢:
SELECT cast('2000-08-19' as date) + INTERVAL '14' day;
使用 datediff 的注意點(diǎn)
Hive datediff
函數(shù)返回兩個(gè)日期之間的天數(shù)差,其聲明如下:
datediff(string enddate, string startdate) -> integer
相等的Trino函數(shù)date_diff對(duì)兩個(gè)日期參數(shù)使用相反的順序,并且需要一個(gè)單位。在遷移時(shí)必須考慮到這一點(diǎn):
Hive查詢:
datediff(enddate, startdate)
Trino查詢:
date_diff('day', startdate, enddate)
在插入時(shí)覆蓋數(shù)據(jù)
默認(rèn)情況下,INSERT查詢是不允許覆蓋現(xiàn)有數(shù)據(jù)的。你可以使用目錄會(huì)話屬性insert_existing_partitions_behavior
來允許覆寫。在使用Hive連接器的目錄名稱前加上前綴,例如hdfs
,并在運(yùn)行插入查詢之前在會(huì)話中設(shè)置該屬性:
SET SESSION hdfs.insert_existing_partitions_behavior = 'OVERWRITE';
INSERT INTO hdfs.schema.table ...
產(chǎn)生的行為等同于在Hive中使用INSERT OVERWRITE。
當(dāng)表存儲(chǔ)在加密的HDFS上,當(dāng)表是未分區(qū)的或者表是事務(wù)性的,Trino不支持插入覆蓋操作。
支持容錯(cuò)執(zhí)行
該連接器支持查詢處理的容錯(cuò)執(zhí)行。在非事務(wù)表上的任何重試策略下都支持讀和寫操作。
讀取操作在事務(wù)表上支持任何重試策略。寫操作和CREATE TABLE … AS操作不支持在事務(wù)表上的任何重試策略。可以通過部署配置啟動(dòng)外部數(shù)據(jù)緩存加強(qiáng)容錯(cuò)執(zhí)行。
性能
表的統(tǒng)計(jì)信息
Hive連接器支持收集和管理表的統(tǒng)計(jì)數(shù)據(jù)以提高查詢處理性能。
在寫入數(shù)據(jù)時(shí),Hive連接器總是收集基本的統(tǒng)計(jì)數(shù)據(jù)(numFiles, numRows, rawDataSize, totalSize),默認(rèn)情況下也會(huì)收集列級(jí)的統(tǒng)計(jì)數(shù)據(jù):
Column type | Collectible statistics |
---|---|
TINYINT |
空值的數(shù)量,不同值的數(shù)量,最小/最大值 |
SMALLINT |
空值的數(shù)量,不同值的數(shù)量,最小/最大值 |
INTEGER |
空值的數(shù)量,不同值的數(shù)量,最小/最大值 |
BIGINT |
空值的數(shù)量,不同值的數(shù)量,最小/最大值 |
DOUBLE |
空值的數(shù)量,不同值的數(shù)量,最小/最大值 |
REAL |
空值的數(shù)量,不同值的數(shù)量,最小/最大值 |
DECIMAL |
空值的數(shù)量,不同值的數(shù)量,最小/最大值 |
DATE |
空值的數(shù)量,不同值的數(shù)量,最小/最大值 |
TIMESTAMP |
空值的數(shù)量,不同值的數(shù)量,最小/最大值 |
VARCHAR |
空值的數(shù)量,不同值的數(shù)量, |
CHAR |
空值的數(shù)量,不同值的數(shù)量, |
VARBINARY |
空值的數(shù)量 |
BOOLEAN |
空值的數(shù)量,True/False值的數(shù)量, |
更新表和分區(qū)的統(tǒng)計(jì)數(shù)據(jù)
如果你的查詢很復(fù)雜,包括連接大型數(shù)據(jù)集,在表/分區(qū)上運(yùn)行ANALYZE可能會(huì)通過收集數(shù)據(jù)的統(tǒng)計(jì)信息來提高查詢性能。
當(dāng)分析一個(gè)分區(qū)表時(shí),可以通過可選的分區(qū)屬性來指定要分析的分區(qū),分區(qū)屬性是一個(gè)數(shù)組,包含分區(qū)鍵的值,其順序是在表模式中聲明的:
ANALYZE table_name WITH (
partitions = ARRAY[
ARRAY['p1_value1', 'p1_value2'],
ARRAY['p2_value1', 'p2_value2']])
這個(gè)查詢將收集兩個(gè)分區(qū)的統(tǒng)計(jì)數(shù)據(jù),鍵值為p1_value1, p1_value2和p2_value1, p2_value2。
在寬表上,收集所有列的統(tǒng)計(jì)數(shù)據(jù)可能很昂貴,并對(duì)查詢計(jì)劃產(chǎn)生不利影響。它通常也是不必要的–統(tǒng)計(jì)數(shù)據(jù)只對(duì)特定的列有用,比如連接鍵、謂詞、分組鍵。我們可以通過可選的列屬性指定要分析的列的子集:
ANALYZE table_name WITH (
partitions = ARRAY[ARRAY['p2_value1', 'p2_value2']],
columns = ARRAY['col_1', 'col_2'])
這個(gè)查詢收集了鍵值為p2_value1, p2_value2的分區(qū)的col_1和col_2列的統(tǒng)計(jì)信息。
請(qǐng)注意,如果以前收集了所有列的統(tǒng)計(jì)數(shù)據(jù),那么在重新分析一個(gè)子集之前,必須放棄它們:
CALL system.drop_stats('schema_name', 'table_name')
你也可以只刪除選定分區(qū)的統(tǒng)計(jì)數(shù)據(jù):
CALL system.drop_stats(
schema_name => 'schema',
table_name => 'table',
partition_values => ARRAY[ARRAY['p2_value1', 'p2_value2']])
動(dòng)態(tài)過濾
Hive連接器支持動(dòng)態(tài)過濾優(yōu)化。對(duì)于以任何文件格式存儲(chǔ)的分區(qū)表,支持動(dòng)態(tài)分區(qū)修剪,用于廣播和分區(qū)連接。對(duì)于以任何文件格式存儲(chǔ)的桶狀表,僅支持廣播連接的動(dòng)態(tài)桶狀修剪。
對(duì)于以O(shè)RC或Parquet文件格式存儲(chǔ)的表,動(dòng)態(tài)過濾器也被推送到工作節(jié)點(diǎn)的本地表掃描中,用于廣播連接。推送到ORC和Parquet讀取器中的動(dòng)態(tài)過濾器謂詞被用來執(zhí)行條帶或行組修剪并節(jié)省磁盤I/O。在ORC或Parquet文件中按連接標(biāo)準(zhǔn)中使用的列對(duì)數(shù)據(jù)進(jìn)行排序,可以顯著提高條帶或行組修剪的有效性。這是因?yàn)樵谕粭l帶或行組內(nèi)對(duì)類似的數(shù)據(jù)進(jìn)行分組,可以極大地提高在條帶或行組級(jí)別維護(hù)的最小/最大索引的選擇性。
延遲執(zhí)行動(dòng)態(tài)過濾器
在開始表掃描之前,等待動(dòng)態(tài)過濾器的收集往往是有益的。如果動(dòng)態(tài)過濾能夠減少掃描的數(shù)據(jù)量,那么這種額外的等待時(shí)間可能會(huì)在查詢和CPU時(shí)間上帶來巨大的節(jié)省。
對(duì)于Hive連接器,通過使用目錄文件中的配置屬性hive.dynamic-filtering.wait-timeout
或目錄會(huì)話屬性<hive-catalog>.dynamic_filtering_wait_timeout
,可以將表掃描延遲到收集動(dòng)態(tài)過濾器的時(shí)間。
存儲(chǔ)緩存
使用Hive連接器查詢對(duì)象存儲(chǔ)是Trino的一個(gè)非常常見的用例。它經(jīng)常涉及到大量數(shù)據(jù)的傳輸。對(duì)象是由多個(gè)工作者從HDFS或任何其他支持的對(duì)象存儲(chǔ)中檢索出來的,并在這些工作者上進(jìn)行處理。帶有不同參數(shù)的重復(fù)查詢,甚至是來自不同用戶的不同查詢,經(jīng)常會(huì)訪問,并因此傳輸相同的對(duì)象。
好處
-
降低對(duì)象存儲(chǔ)的負(fù)荷
每一個(gè)被檢索和緩存的對(duì)象都避免了在后續(xù)查詢中從存儲(chǔ)中重復(fù)檢索。因此,對(duì)象存儲(chǔ)系統(tǒng)不必一次又一次地提供該對(duì)象。
例如,如果你的查詢從存儲(chǔ)中訪問100MB的對(duì)象,在查詢第一次運(yùn)行時(shí),100MB被下載和緩存。任何后續(xù)查詢都會(huì)使用這些對(duì)象。如果你的用戶再運(yùn)行100個(gè)查詢,訪問相同的對(duì)象,你的存儲(chǔ)系統(tǒng)就不必做任何重要的工作。如果沒有緩存,它必須一次又一次地提供相同的對(duì)象,導(dǎo)致10GB的總存儲(chǔ)服務(wù)。
這種對(duì)對(duì)象存儲(chǔ)的負(fù)載減少也會(huì)影響對(duì)象存儲(chǔ)系統(tǒng)的大小,從而影響其成本。
-
提高查詢性能
緩存可以提供顯著的性能優(yōu)勢(shì),因?yàn)樗苊饬酥貜?fù)的網(wǎng)絡(luò)傳輸,而是從本地緩存中訪問對(duì)象的副本。如果直接訪問對(duì)象存儲(chǔ)的性能比訪問緩存的性能低,那么性能提升就更加顯著。
例如,如果你在不同的網(wǎng)絡(luò)、不同的數(shù)據(jù)中心、甚至不同的云提供商區(qū)域訪問對(duì)象存儲(chǔ),查詢性能就會(huì)很慢。增加使用快速的本地存儲(chǔ)的緩存有很大的影響,使你的查詢速度大大加快。
另一方面,如果你的對(duì)象存儲(chǔ)已經(jīng)在I/O和網(wǎng)絡(luò)訪問方面以非常高的性能運(yùn)行,而你的本地緩存存儲(chǔ)的速度類似,甚至更慢,那么性能方面的好處可能是最小的。
-
降低查詢成本
前面提到的減少對(duì)象存儲(chǔ)的負(fù)載的結(jié)果是大大減少了網(wǎng)絡(luò)流量。然而,網(wǎng)絡(luò)流量在設(shè)置中是一個(gè)相當(dāng)大的成本因素,特別是在公共云供應(yīng)商系統(tǒng)中托管時(shí)。
架構(gòu)
緩存可以在兩種模式下運(yùn)行。異步模式直接提供被查詢的數(shù)據(jù),并在之后異步地緩存任何對(duì)象。異步是默認(rèn)和推薦的模式。查詢不需要支付預(yù)熱緩存的費(fèi)用。緩存是在后臺(tái)填充的,如果緩存還沒有填充,查詢就會(huì)繞過緩存。任何請(qǐng)求緩存對(duì)象的后續(xù)查詢都會(huì)直接從緩存中得到服務(wù)。
另一種模式是緩存回調(diào)。在這種模式下,如果一個(gè)對(duì)象在緩存中沒有找到,它將從存儲(chǔ)中讀取,放在緩存中,然后提供給請(qǐng)求的查詢。在通讀模式下,查詢總是從高速緩存中讀取,并且必須等待高速緩存的填充。
在這兩種模式下,對(duì)象都被緩存在每個(gè)工作者的本地存儲(chǔ)中。工作者可以從其他工作者那里請(qǐng)求緩存的對(duì)象,以避免從對(duì)象存儲(chǔ)中請(qǐng)求。
緩存塊的大小為1MB,很適合ORC或Parquet文件格式。
配置
緩存功能是Hive連接器的一部分,可以在目錄屬性文件中激活:
connector.name=hive
hive.cache.enabled=true
hive.cache.location=/opt/hive-cache
緩存在協(xié)調(diào)器和所有訪問對(duì)象存儲(chǔ)的工作者上運(yùn)行。用于管理BookKeeper和數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)端口(默認(rèn)為8898和8899)需要是可用的。
要在多個(gè)目錄上使用緩存,你需要配置不同的緩存目錄和不同的BookKeeper和數(shù)據(jù)傳輸端口。
Cache Configuration Parameters
Property | Description | Default |
---|---|---|
hive.cache.enabled |
切換以啟用或禁用緩存 | false |
hive.cache.location |
用于每個(gè)工作者的緩存存儲(chǔ)的必要目錄位置。用逗號(hào)分隔多個(gè)目錄,這些目錄可以是單獨(dú)驅(qū)動(dòng)器的掛載點(diǎn)。更多提示可以在 recommendation 中找到。例如:hive.cache.location=/var/lib/trino/cache1,/var/lib/trino/cache2 。 |
|
hive.cache.data-transfer-port |
用于傳輸緩存管理的數(shù)據(jù)的TCP/IP端口。 | 8898 |
hive.cache.bookkeeper-port |
管理緩存的BookKeeper使用的TCP/IP端口。 | 8899 |
hive.cache.read-mode |
緩存的操作模式,如前面架構(gòu)部分所述。支持的模式是 "async"和 “read-through”。 | async |
hive.cache.ttl |
緩存中的對(duì)象的保存時(shí)長。沒有被請(qǐng)求過TTL值的對(duì)象會(huì)從緩存中刪除。 | 7d |
hive.cache.disk-usage-percentage |
用于緩存數(shù)據(jù)的磁盤空間的百分比。 | 80 |
建議
本地緩存存儲(chǔ)的速度對(duì)緩存的性能至關(guān)重要。最常見和最經(jīng)濟(jì)的方法是安裝高性能的SSD磁盤或類似的磁盤。快速的緩存性能也可以用RAM磁盤作為內(nèi)存來實(shí)現(xiàn)。
在所有情況下,你應(yīng)該避免使用節(jié)點(diǎn)的根分區(qū)和磁盤,而是在每個(gè)節(jié)點(diǎn)上為緩存附加多個(gè)專用的存儲(chǔ)設(shè)備。緩存使用磁盤的比例是可配置的。存儲(chǔ)應(yīng)該是每個(gè)協(xié)調(diào)者和工作者節(jié)點(diǎn)上的本地存儲(chǔ)。在Trino啟動(dòng)之前,目錄需要存在。我們建議使用多個(gè)設(shè)備來提高緩存的性能。
連接的存儲(chǔ)設(shè)備的容量應(yīng)該比查詢的對(duì)象存儲(chǔ)工作負(fù)載的大小大20-30%左右。例如,你目前的查詢工作負(fù)載通常訪問HDFS存儲(chǔ)中的分區(qū),這些分區(qū)封裝了過去3個(gè)月的數(shù)據(jù)。這些分區(qū)的總體大小目前為1TB。因此,你的緩存驅(qū)動(dòng)器的總?cè)萘勘仨毷?.2TB或更大。
你對(duì)Trino的部署方法決定了如何創(chuàng)建用于緩存的目錄。通常情況下,你需要連接一個(gè)快速的存儲(chǔ)系統(tǒng),如SSD驅(qū)動(dòng)器,并確保它安裝在配置的路徑上。Kubernetes、CFT和其他系統(tǒng)允許通過卷來實(shí)現(xiàn)。
Metrics
為了驗(yàn)證緩存在你的系統(tǒng)上是如何工作的,你可以采取多種方法:
-
檢查所有節(jié)點(diǎn)上的緩存存儲(chǔ)驅(qū)動(dòng)器的磁盤使用情況
-
查詢由JMX公開的緩存系統(tǒng)的指標(biāo)
緩存的實(shí)現(xiàn)通過JMX暴露了一些指標(biāo)。你可以直接在Trino中用JMX連接器或在外部工具中檢查這些和其他指標(biāo)。
目錄的基本緩存統(tǒng)計(jì)數(shù)據(jù)可在jmx.current."rubix:catalog=<catalog_name>,name=stats "
表中找到。jmx.current."rubix:catalog=<catalog_name>,type=detailed,name=stats"
表包含更詳細(xì)的統(tǒng)計(jì)數(shù)據(jù)。
下面的示例查詢返回Hive目錄的平均緩存命中率:
SELECT avg(cache_hit)
FROM jmx.current. "rubix:catalog=hive,name=stats"
WHERE NOT is_nan(cache_hit);
限制
緩存不支持用戶模擬,不能與Kerberos保護(hù)的HDFS一起使用。它不考慮任何特定于用戶的對(duì)象存儲(chǔ)訪問權(quán)限。緩存的對(duì)象對(duì)于緩存系統(tǒng)來說只是透明的二進(jìn)制blob,并且可以完全訪問所有內(nèi)容。
表的重定向
Trino提供了一種可能性,即根據(jù)表的格式和目錄配置,將對(duì)現(xiàn)有表的操作透明地重定向到適當(dāng)?shù)哪夸洝?/p>
在依賴元存儲(chǔ)服務(wù)的連接器的背景下(例如,Hive連接器、Iceberg連接器和Delta Lake連接器),元存儲(chǔ)(Hive元存儲(chǔ)服務(wù)、AWS Glue數(shù)據(jù)目錄)可以用來習(xí)慣不同的表格式。因此,一個(gè)元存儲(chǔ)數(shù)據(jù)庫可以容納各種不同格式的表。
作為一個(gè)具體的例子,讓我們使用下面這個(gè)簡(jiǎn)單的場(chǎng)景,它利用了表的重定向:
USE example.example_schema;
EXPLAIN SELECT * FROM example_table;
Query Plan
-------------------------------------------------------------------------
Fragment 0 [SOURCE]
...
Output[columnNames = [...]]
│ ...
└─ TableScan[table = another_catalog:example_schema:example_table]
...
EXPLAIN語句的輸出指出了處理表example_table的SELECT查詢的實(shí)際目錄。
當(dāng)使用全路徑表名時(shí),表的重定向功能也能發(fā)揮作用:
EXPLAIN SELECT * FROM example.example_schema.example_table;
Query Plan
-------------------------------------------------------------------------
Fragment 0 [SOURCE]
...
Output[columnNames = [...]]
│ ...
└─ TableScan[table = another_catalog:example_schema:example_table]
...
Trino為以下操作提供表的重定向支持:
- Table read operations
- SELECT
- DESCRIBE
- SHOW STATS
- SHOW CREATE TABLE
- Table write operations
- INSERT
- UPDATE
- MERGE
- DELETE
- Table management operations
- ALTER TABLE
- DROP TABLE
- COMMENT
Trino不提供視圖重定向支持。
該連接器支持從Hive表重定向到Iceberg和Delta Lake表,目錄配置屬性如下:
-
hive.iceberg-catalog-name
用于將查詢重定向至Iceberg連接器 -
hive.delta-lake-catalog-name
用于重定向查詢到Delta Lake連接器。
性能調(diào)優(yōu)配置屬性
下表描述了Hive連接器的性能調(diào)優(yōu)屬性。
性能調(diào)整配置屬性被認(rèn)為是專家級(jí)的功能。改變這些屬性的默認(rèn)值可能會(huì)導(dǎo)致不穩(wěn)定和性能下降。
Property name | Description | Default value |
---|---|---|
hive.max-outstanding-splits |
在調(diào)度器嘗試暫停之前,查詢中每個(gè)表掃描的緩沖分割的目標(biāo)數(shù)量。 | 1000 |
hive.max-outstanding-splits-size |
在查詢失敗之前,查詢中每個(gè)表掃描的緩沖分割所允許的最大尺寸。 | 256 MB |
hive.max-splits-per-second |
每秒鐘每張表掃描產(chǎn)生的最大分片數(shù)。這可以用來減少存儲(chǔ)系統(tǒng)的負(fù)載。默認(rèn)情況下,沒有限制,這將導(dǎo)致Trino最大限度地實(shí)現(xiàn)數(shù)據(jù)訪問的并行化。 | |
hive.max-initial-splits |
對(duì)于每個(gè)表的掃描,協(xié)調(diào)器首先分配最多為max-initial-split-size 的文件部分。在 max-initial-splits 被分配后,max-split-size 被用于剩余的分片。 |
200 |
hive.max-initial-split-size |
在max-initial-splits 分配完畢之前,分配給工作者的單個(gè)文件段的大小。較小的分割導(dǎo)致更多的并行性,這對(duì)較小的查詢有促進(jìn)作用。 |
32 MB |
hive.max-split-size |
分配給工作者的單個(gè)文件部分的最大尺寸。較小的分割導(dǎo)致更多的并行性,因此可以減少延遲,但也有更多的開銷,增加系統(tǒng)的負(fù)載。 |
File formats
Hive連接器支持以下文件類型和格式:
- ORC
- Parquet
- Avro
- RCText (RCFile using
ColumnarSerDe
) - RCBinary (RCFile using
LazyBinaryColumnarSerDe
) - SequenceFile
- JSON (using
org.apache.hive.hcatalog.data.JsonSerDe
) - CSV (using
org.apache.hadoop.hive.serde2.OpenCSVSerde
) - TextFile
ORC format configuration properties
以下屬性用于配置由Hive連接器執(zhí)行的對(duì)ORC文件的讀和寫操作。文章來源:http://www.zghlxwxcb.cn/news/detail-466148.html
Property Name | Description | Default |
---|---|---|
hive.orc.time-zone |
為沒有聲明時(shí)區(qū)的傳統(tǒng)ORC文件設(shè)置默認(rèn)時(shí)區(qū)。 | JVM default |
hive.orc.use-column-names |
通過名稱訪問ORC列。默認(rèn)情況下,ORC文件中的列是通過它們?cè)贖ive表定義中的序號(hào)位置來訪問的。相等的目錄會(huì)話屬性是orc_use_column_names 。 |
false |
hive.orc.bloom-filters.enabled |
啟用用于謂詞下推的Bloom過濾器。 | false |
Parquet format configuration properties
以下屬性用于配置由Hive連接器執(zhí)行的對(duì)Parquet文件的讀寫操作。文章來源地址http://www.zghlxwxcb.cn/news/detail-466148.html
Property Name | Description | Default |
---|---|---|
hive.parquet.time-zone |
將時(shí)間戳值調(diào)整到一個(gè)特定的時(shí)區(qū)。對(duì)于Hive 3.1+,將其設(shè)置為UTC。 | JVM default |
hive.parquet.use-column-names |
默認(rèn)情況下,通過名稱訪問Parquet列。將此屬性設(shè)置為false ,以按Hive表定義中的順序位置訪問列。相等的目錄會(huì)話屬性是parquet_use_column_names 。 |
true |
parquet.optimized-reader.enabled |
讀取Parquet文件時(shí),是否使用分批讀列器以提高性能。將此屬性設(shè)置為false 以默認(rèn)禁用優(yōu)化的parquet閱讀器。相等的目錄會(huì)話屬性是parquet_optimized_reader_enabled 。 |
true |
parquet.optimized-writer.enabled |
寫入Parquet文件時(shí)是否使用優(yōu)化的寫入器。將此屬性設(shè)置為false 以默認(rèn)禁用優(yōu)化的Parquet寫入器。相等的目錄會(huì)話屬性是parquet_optimized_writer_enabled 。 |
true |
parquet.optimized-writer.validation-percentage |
當(dāng)parquet.optimized-writer.enabled 設(shè)置為true 時(shí),通過重讀整個(gè)文件來驗(yàn)證寫入后的parquet文件的百分比。相等的目錄會(huì)話屬性是parquet_optimized_writer_validation_percentage 。可以通過設(shè)置該屬性為 0 來關(guān)閉驗(yàn)證功能。 |
5 |
parquet.writer.page-size |
Parquet寫入器的最大頁面尺寸。 | 1 MB |
parquet.writer.block-size |
Parquet寫入器的最大行組大小。 | 128 MB |
parquet.writer.batch-size |
在一個(gè)批次中,parquet寫入器所處理的最大行數(shù)。 | 10000 |
parquet.use-bloom-filter |
讀取Parquet文件時(shí),是否使用bloom過濾器來推倒謂詞。將此屬性設(shè)置為 false ,默認(rèn)情況下禁止使用bloom過濾器。相等的目錄會(huì)話屬性是parquet_use_bloom_filter 。 |
true |
parquet.max-read-block-row-count |
設(shè)置一個(gè)批次中讀取的最大行數(shù)。 | 8192 |
parquet.optimized-nested-reader.enabled |
當(dāng)從Parquet文件中讀取ARRAY、MAP和ROW類型時(shí),是否應(yīng)該使用分批列讀器以提高性能。將此屬性設(shè)置為false 以默認(rèn)禁用結(jié)構(gòu)數(shù)據(jù)類型的優(yōu)化parquet閱讀器。相等的目錄會(huì)話屬性是parquet_optimized_nested_reader_enabled 。 |
true |
與Hive 3有關(guān)的限制
- 由于安全原因,
sys
系統(tǒng)目錄無法訪問。 - 不支持Hive的
timestamp with local zone
數(shù)據(jù)類型??梢詮木哂羞@種類型的列的表中讀出,但不能訪問該列數(shù)據(jù)。不支持向這樣的表寫入。 - 由于Hive問題HIVE-21002和HIVE-22167,Trino不能正確讀取由Hive 3.1或更高版本創(chuàng)建的Parquet、RCBinary或Avro文件格式中的
時(shí)間戳
值。當(dāng)從這些文件格式讀取時(shí),Trino返回的結(jié)果與Hive不同。 - Trino不支持為Hive事務(wù)表收集表的統(tǒng)計(jì)數(shù)據(jù)。你必須在創(chuàng)建表后使用Hive的ANALYZE語句來收集表的統(tǒng)計(jì)數(shù)據(jù)。
到了這里,關(guān)于【Trino實(shí)戰(zhàn)】Hive connector功能性文檔的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!