Presto學譯 | 3. 配置Hive連接器以查詢Hive數據

本文爲官方文檔譯文。僅限交流使用。

系列目錄

概述

使用 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!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章