Apache Hive JdbcStorageHandler 编程入门指南
以下博文轉載自:https://www.iteblog.com/archives/2525.html
Apache Hive 從 HIVE-1555 開始引入了 JdbcStorageHandler ,這個使得 Hive 能夠讀取 JDBC 數據源,關于 Apache Hive 引入 JdbcStorageHandler 的背景可以參見 《Apache Hive 聯邦查詢(Query Federation)》。本文主要簡單介紹 JdbcStorageHandler 的使用。
語法
JdbcStorageHandler 使得 Hive 能夠讀取 JDBC 數據源,目前 JdbcStorageHandler 不支持將數據寫入到 JDBC 數據源。為了使用 JdbcStorageHandler ,我們需要在 Hive 中創建外部表,具體如下:
CREATE EXTERNAL TABLE iteblog (name string,age int,gpa double ) STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler' TBLPROPERTIES ("hive.sql.database.type" = "MYSQL","hive.sql.jdbc.driver" = "com.mysql.jdbc.Driver","hive.sql.jdbc.url" = "jdbc:mysql://www.iteblog.com/sample","hive.sql.dbcp.username" = "hive","hive.sql.dbcp.password" = "hive","hive.sql.table" = "STUDENT","hive.sql.dbcp.maxActive" = "1" );我們可以使用 alter table 命令來修改表的 JdbcStorageHandler 屬性,就和正常的表一樣,如下:
ALTER TABLE iteblog SET TBLPROPERTIES ("hive.sql.dbcp.password" = "passwd");JdbcStorageHandler 支持的表屬性
必選屬性
在 Hive 中使用 JdbcStorageHandler ,下面的屬性是必須指定的
可選屬性:
除了上面的必選屬性,JdbcStorageHandler 還支持以下幾個可選屬性:
支持的數據類型
JdbcStorageHandler 表中列支持的數據類型有:
復雜的數據類型,比如 struct, map, array 目前還不支持。
列和數據類型映射
hive.sql.table / hive.sql.query 使用模式定義表格數據,模式定義必須與表模式定義相同。 例如,以下 create table 語句將失敗:
CREATE EXTERNAL TABLE iteblog (name string,age int,gpa double ) STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler' TBLPROPERTIES (. . . . . ."hive.sql.query" = "SELECT name, age, gpa, gender FROM STUDENT", );但是 hive.sql.table / hive.sql.query 模式的列名和列類型可能與表的模式不同。 在這種情況下,數據庫列按位置映射到 hive 列;如果數據類型不同,Hive 將嘗試根據 Hive 表模式轉換它。 例如:
CREATE EXTERNAL TABLE iteblog (sname string,age int,effective_gpa decimal(4,3) ) STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler' TBLPROPERTIES (. . . . . ."hive.sql.query" = "SELECT name, age, gpa FROM STUDENT", );In case the conversion is not possible, Hive will produce null for the field.
Hive 將嘗試將 STUDENT 表的 gpa 的 double 類型轉換為 decimal(4,3) 作為 iteblog 表的 effective_gpa 字段。如果無法進行轉換,Hive 將把該字段的值轉換為 null。
Auto Shipping
如果在查詢中使用了 JdbcStorageHandler,JdbcStorageHandler 會自動將所需的 jar 發送到 MR/Tez/LLAP 后端。用戶無需手動添加 jar。 如果在 classpath 中檢測到任何 jdbc 驅動程序的 jar(包括mysql、postgres、oracle 和 mssql),JdbcStorageHandler 還會將所需的 jdbc 驅動程序 jar 發送到后端。但是,用戶仍然需要將 jdbc 驅動程序 jar 復制到 hive 的 classpath(通常是 hive 的 lib 目錄)。
密碼保護(Securing Password)
在大多數情況下,我們不希望在表屬性“hive.sql.dbcp.password”中以明文的形式存儲 jdbc 密碼。相反,用戶可以使用以下命令將密碼存儲在 HDFS 上的 Java 密鑰庫文件中:
hadoop credential create host1.password -provider jceks://hdfs/user/foo/test.jceks -v passwd1 hadoop credential create host2.password -provider jceks://hdfs/user/foo/test.jceks -v passwd2這將在 hdfs://user/foo/test.jceks 里面創建一個 keystore 文件,其中包含兩個密鑰:host1.password 和 host2.password。在 Hive 中創建表時,我們需要在 create table 語句中指定“hive.sql.dbcp.password.keystore”和“hive.sql.dbcp.password.key”而不是“hive.sql.dbcp.password”,具體如下:
CREATE EXTERNAL TABLE iteblog (name string,age int,gpa double ) STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler' TBLPROPERTIES (. . . . . ."hive.sql.dbcp.password.keystore" = "jceks://hdfs/user/foo/test.jceks","hive.sql.dbcp.password.key" = "host1.password",. . . . . . );我們需要通過僅授權目標用戶讀取此文件來保護 keystore 文件。Hive 將檢查 keystore 文件的權限,以確保用戶在創建/更改表時具有讀取權限。
分區
Hive 能夠拆分 jdbc 數據源并以并行的方式處理每個分片。用戶可以使用以下表屬性來決定是否拆分以及拆分的分片數:
使用示例如下:
TBLPROPERTIES (. . . . . ."hive.sql.table" = "DEMO","hive.sql.partitionColumn" = "num","hive.sql.numPartitions" = "3","hive.sql.lowerBound" = "1","hive.sql.upperBound" = "10",. . . . . . );這種表將會拆分成3個分片,num<4 or num is null, 4< =num<7, num>=7
TBLPROPERTIES (. . . . . ."hive.sql.query" = "SELECT name, age, gpa/5.0*100 AS percentage FROM STUDENT","hive.sql.partitionColumn" = "percentage","hive.sql.numPartitions" = "4",. . . . . . );Hive 將執行 jdbc 查詢以獲取 percentage 列的 MIN/MAX,這張表對應的 min/max 為 60/100。然后表將創建4個分片:(,70),[70,80),[80,90),[90,)。 第一個分片還包括空值。
如果要查看 JdbcStorageHandler 生成的分片,可以在 hiveserver2 日志或 Tez AM 日志中查找以下消息:
jdbc.JdbcInputFormat: Num input splits created 4 jdbc.JdbcInputFormat: split:interval:ikey[,70) jdbc.JdbcInputFormat: split:interval:ikey[70,80) jdbc.JdbcInputFormat: split:interval:ikey[80,90) jdbc.JdbcInputFormat: split:interval:ikey[90,)計算下推
Hive 會積極地將計算推送到 jdbc 表,因此我們可以充分利用 jdbc 數據源的計算能力。比如,我們有另外一張名為 iteblog_hadoop 表,如下:
CREATE EXTERNAL TABLE iteblog_hadoop (name string,age int,registration string,contribution decimal(10,2) ) STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler' TBLPROPERTIES ("hive.sql.database.type" = "MYSQL","hive.sql.jdbc.driver" = "com.mysql.jdbc.Driver","hive.sql.jdbc.url" = "jdbc:mysql://www.iteblog.com/sample","hive.sql.dbcp.username" = "hive","hive.sql.dbcp.password" = "hive","hive.sql.table" = "VOTER" );那么下面的 Join 操作將會下推到 MySql 執行:
select * from iteblog join iteblog_hadoop on student_jdbc.name=voter_jdbc.name;可以通過explain查看生成的執行計劃:
explain select * from iteblog join iteblog_hadoop on student_jdbc.name=voter_jdbc.name;. . . . . .TableScanalias: iteblog properties:hive.sql.query SELECT `t`.`name`, `t`.`age`, `t`.`gpa`, `t0`.`name` AS `name0`, `t0`.`age` AS `age0`, `t0`.`registration`, `t0`.`contribution` FROM (SELECT * FROM `STUDENT` WHERE `name` IS NOT NULL) AS `t` INNER JOIN (SELECT * FROM `VOTER` WHERE `name` IS NOT NULL) AS `t0` ON `t`.`name` = `t0`.`name`. . . . . .計算下推僅在 jdbc 表由 hive.sql.table 定義時才會發生。 Hive 將重寫 hive.sql.query,并在 jdbc 表上進行更多計算。在上面的例子中,mysql 將運行查詢并檢索 join 的結果,而不是獲取兩個表的數據,然后在 Hive 中進行 join 操作。
目前支持算子下推的操作符包括 filter, transform, join, union, aggregation 以及 sort。
總結
以上是生活随笔為你收集整理的Apache Hive JdbcStorageHandler 编程入门指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平安惠普是哪家银行
- 下一篇: 逾期还款等负面信息不是永久记录