本文為官方文檔譯文片择。僅限交流使用嚎卫。
概述
使用 Presto 查詢Hive中的數(shù)據(jù)恐怕是最常用的了勃救。Hive 連接器就允許查詢在 Hive 數(shù)據(jù)倉庫中的數(shù)據(jù)新锈。Hive 由下面三個(gè)組件組成:
- 存儲在 HDFS 或者 Amazon S3 中的各種各樣格式的數(shù)據(jù)文件甲脏。
- 用于映射模式與表的元數(shù)據(jù)。這些元數(shù)據(jù)被存儲在一個(gè)數(shù)據(jù)庫中妹笆,比如 MySQL块请, 并且可以用過 Hive 的元數(shù)據(jù)服務(wù)盡情存取。
- 叫做 HiveQL 的查詢語言拳缠。
Presto 僅僅使用前兩個(gè)組件:數(shù)據(jù)與元數(shù)據(jù)墩新。而不使用 HiveSQL 或者 Hive 的任何執(zhí)行環(huán)境。
支持的文件格式
現(xiàn)在(0.183)的 Hive 連接器支持的文件格式如下:
- ORC
- Parquet
- Avro
- RCFile
- SequenceFile
- JSON
- Text
配置
Hive 連接器支持 Apache Hadoop 2.x 與從其衍生出來的平臺窟坐,比如 CDH 5 與 Hortonworks海渊。
在 etc/catalog/hive.properties
中配置如下內(nèi)容來掛載 hive-hadoop2
連接器作為 hive
catalog绵疲。其中的 hive.metastore.uri
就是指定 Hive 元數(shù)據(jù)的地址,請很據(jù)實(shí)際情況修改臣疑。
connector.name=hive-hadoop2
hive.metastore.uri=thrift://example.net:9083
多個(gè) Hive 集群
如果你需要更多的 catalogs盔憨,你可以再次在 etc/catalog 添加另一個(gè) Hive 連接器的相關(guān)配置文件,且配置文件的的名字要與其他不同讯沈。
HDFS 配置
在最基礎(chǔ)的設(shè)置中郁岩,Presto 會自動(dòng)配置 HDFS 的客戶端,不需要任何的配置文件缺狠。但是在一些情況下问慎,比如使用同盟 HDFS 或者 NameNode 高可用,為了能夠正常存取 HDFS 集群儒老,就需要另外配置 HDFS 客戶端選項(xiàng)蝴乔。為了達(dá)到目的,就需要設(shè)置 hive.config.resources
屬性來引用你的 HDFS 配置文件:
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
最好只在需要配置文件的時(shí)候才進(jìn)行配置驮樊,并且盡量精簡配置文件中中的屬性,額外的屬性可能會造成問題片酝。
而且在所有的 Presto 節(jié)點(diǎn)中都要存在該配置文件囚衔。如果你直接引用的 hadoop 的配置文件,別忘了將配置文件拷貝到?jīng)]有 Hadoop 存在的節(jié)點(diǎn)上雕沿。
HDFS 用戶名
如果 HDFS 沒有使用 Kerberos练湿, Presto進(jìn)程將會使用系統(tǒng)用戶來存取 HDFS。你可以通過配置 JVM 系統(tǒng)屬性 HADOOP_USER_NAME
來指定用戶名审轮。比如當(dāng)前使用 hdfs_user 作為存取 HDFS 的用戶名:
-DHADOOP_USER_NAME=hdfs_user
Presto 中的數(shù)據(jù)類型轉(zhuǎn)換
- varchar 可以和 tinyint, smallint, integer, bigint 互相轉(zhuǎn)換肥哎。
- real 可以轉(zhuǎn)成 double。(real 是什么)
- 整型的可以擴(kuò)大范圍轉(zhuǎn)換疾渣,比如 tinyint 轉(zhuǎn) smallint篡诽。
如果類型轉(zhuǎn)換失敗,就會返回 null榴捡。
一些例子
一般的查詢語法與 HiveQL 都是相同的杈女,下面介紹些操作模式(數(shù)據(jù)庫)與表的例子。
創(chuàng)建一個(gè)名叫 web 的模式(數(shù)據(jù)庫)吊圾,并存儲在 S3 中:
CREATE SCHEMA hive.web
WITH (location = 's3://my-bucket/')
在 web 中創(chuàng)建一個(gè)名叫page_views 的表达椰,使用 ORC 的格式進(jìn)行存儲;添加分區(qū) ds项乒, country啰劲;使用 user_id 進(jìn)行分桶,且數(shù)目為 50 個(gè)檀何。
CREATE TABLE hive.web.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
)
刪除一個(gè)分區(qū)中的數(shù)據(jù):
DELETE FROM hive.web.page_views
WHERE ds = DATE '2016-08-09'
AND country = 'US'
創(chuàng)建一個(gè)外部表蝇裤,名叫 request_logs
:
CREATE TABLE hive.web.request_logs (
request_time timestamp,
url varchar,
ip varchar,
user_agent varchar
)
WITH (
format = 'TEXTFILE',
external_location = 's3://my-bucket/data/logs/'
)
刪除這個(gè)外部表廷支,且只會刪除元數(shù)據(jù),不會刪除表的數(shù)據(jù)猖辫。
DROP TABLE hive.web.request_logs
刪除一整個(gè)模式:
DROP SCHEMA hive.web
Hive 連接器的限制
Delete 僅僅在 where 語句中指定的是分區(qū)字段的時(shí)候才可用酥泞。
End!!