本文爲官方文檔譯文。僅限交流使用。
概述
使用 Presto 查詢Hive中的數據恐怕是最常用的了。Hive 連接器就允許查詢在 Hive 數據倉庫中的數據。Hive 由下面三個組件組成:
- 存儲在 HDFS 或者 Amazon S3 中的各種各樣格式的數據文件。
- 用於映射模式與表的元數據。這些元數據被存儲在一個數據庫中,比如 MySQL, 並且可以用過 Hive 的元數據服務盡情存取。
- 叫做 HiveQL 的查詢語言。
Presto 僅僅使用前兩個組件:數據與元數據。而不使用 HiveSQL 或者 Hive 的任何執行環境。
支持的文件格式
現在(0.183)的 Hive 連接器支持的文件格式如下:
- ORC
- Parquet
- Avro
- RCFile
- SequenceFile
- JSON
- Text
配置
Hive 連接器支持 Apache Hadoop 2.x 與從其衍生出來的平臺,比如 CDH 5 與 Hortonworks。
在 etc/catalog/hive.properties
中配置如下內容來掛載 hive-hadoop2
連接器作爲 hive
catalog。其中的 hive.metastore.uri
就是指定 Hive 元數據的地址,請很據實際情況修改。
connector.name=hive-hadoop2
hive.metastore.uri=thrift://example.net:9083
多個 Hive 集羣
如果你需要更多的 catalogs,你可以再次在 etc/catalog 添加另一個 Hive 連接器的相關配置文件,且配置文件的的名字要與其他不同。
HDFS 配置
在最基礎的設置中,Presto 會自動配置 HDFS 的客戶端,不需要任何的配置文件。但是在一些情況下,比如使用同盟 HDFS 或者 NameNode 高可用,爲了能夠正常存取 HDFS 集羣,就需要另外配置 HDFS 客戶端選項。爲了達到目的,就需要設置 hive.config.resources
屬性來引用你的 HDFS 配置文件:
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
最好只在需要配置文件的時候才進行配置,並且儘量精簡配置文件中中的屬性,額外的屬性可能會造成問題。
而且在所有的 Presto 節點中都要存在該配置文件。如果你直接引用的 hadoop 的配置文件,別忘了將配置文件拷貝到沒有 Hadoop 存在的節點上。
HDFS 用戶名
如果 HDFS 沒有使用 Kerberos, Presto進程將會使用系統用戶來存取 HDFS。你可以通過配置 JVM 系統屬性 HADOOP_USER_NAME
來指定用戶名。比如當前使用 hdfs_user 作爲存取 HDFS 的用戶名:
-DHADOOP_USER_NAME=hdfs_user
Presto 中的數據類型轉換
- varchar 可以和 tinyint, smallint, integer, bigint 互相轉換。
- real 可以轉成 double。(real 是什麼)
- 整型的可以擴大範圍轉換,比如 tinyint 轉 smallint。
如果類型轉換失敗,就會返回 null。
一些例子
一般的查詢語法與 HiveQL 都是相同的,下面介紹些操作模式(數據庫)與表的例子。
創建一個名叫 web 的模式(數據庫),並存儲在 S3 中:
CREATE SCHEMA hive.web
WITH (location = 's3://my-bucket/')
在 web 中創建一個名叫page_views 的表,使用 ORC 的格式進行存儲;添加分區 ds, country;使用 user_id 進行分桶,且數目爲 50 個。
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
)
刪除一個分區中的數據:
DELETE FROM hive.web.page_views
WHERE ds = DATE '2016-08-09'
AND country = 'US'
創建一個外部表,名叫 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/'
)
刪除這個外部表,且只會刪除元數據,不會刪除表的數據。
DROP TABLE hive.web.request_logs
刪除一整個模式:
DROP SCHEMA hive.web
Hive 連接器的限制
Delete 僅僅在 where 語句中指定的是分區字段的時候纔可用。
End!!