BigBrother的大数据之旅Day 10 hive(1)
HIVE
1 一些概念
HIve存在的目的:非編程人員使用mapreduce進行分析
HIVE:是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。
HIVE 的driver(核心)包含:
? 解釋器: (解析器) 解釋輸入的hql語句
? 編譯器: hql轉化為語法樹>查詢塊>查詢計劃>物理計劃(MR job)>優化執行
? 優化器: 找到最優化程序進行執行
? 執行器
ANTLR詞法語法分析工具解析hql
HIVE的數據包含 元數據和數據:
? 元數據:表字段,字段類型等,可以放入到mysql等關系型數據庫
? 數據:以文件的形式存放在hdfs上
2 hive 執行流程
3 hive搭建的三種模式
(1) local模式(內置derby數據庫)
(2) 單用戶模式 (MySQL)
(3) 多用戶模式 (Mysql)
hive 上的表是個目錄,
local模式,
<configuration> <!--可以理解為服務器端的配置, 數據庫連接2要素,不需要賬號密碼--> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=metastore_db;create=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>org.apache.derby.jdbc.EmbeddedDriver</value> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <!--可以理解為客戶端的配置--> <property> <name>hive.metastore.local</name> <value>true</value> </property> </configuration>注:使用derby存儲方式時,運行hive會在當前目錄生成一個derby文件和一個metastore_db目錄。這種存儲方式的弊端是在同一個目錄下同時只能有一個hive客戶端能使用數據庫,否則會報錯
<configuration> <!--可以理解為服務器端的配置,需要連接MySQL所以需要數據庫連接4要素--> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive_remote/warehouse</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>password</value> </property> <!--可以理解為客戶端配置--> <property> <name>hive.metastore.local</name> <value>true</value> </property> </configuration>MetaStore server配置文件 (目錄+數據庫連接4要素)
需要事先把MySQL數據連接的jiar放到lib下
<configuration> <!--數據存放位置,會存放在hdfs上--> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property><!--元數據存放在myusql上--> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.57.6:3306/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </property> </configuration>Metastore的客戶端配置文件
<!--客戶端開啟遠程功能--> <configuration> <property> <name>hive.metastore.local</name> <value>false</value> </property> <!--客戶端需要連接的metastore服務器的地址,使用thrift協議--> <property> <name>hive.metastore.uris</name> <value>thrift://192.168.57.5:9083</value> </property> </configuration>a 服務器端需要開啟服務
啟動 hive --service mettastore
b hive默認的數據庫default的目錄為在warehourse.dir的/
如果創建了其他數據庫,會在warehoures.dir/創建
雖然他們在邏輯上是同級的,但是在物理上是層級的
4 HIVE操作
創建表
①Create Table Like:
CREATE TABLE empty_key_value_store LIKE key_value_store;
只在hdfs中創建一個目錄,不開啟mapreduce任務
不復制數據,只復制表結構
②Create Table As Select (CTAS)
CREATE TABLE new_key_value_store
? AS
SELECT columA, columB FROM key_value_store;
在hdfs中復制數據,只開啟map任務,reducer個數為0
復制數據
drop database restrict(默認,不包括下面的表) | cascade (級聯刪除,包括下面的表)
FILEDS_TERMINATED BY 字段被什么截取
COLLECTION
create table tb_user(
? id int,
? name string,
? hobby array,
? addrs map<string,string>
)
hive 分為內部表和外部表
內部表–managed(默認為內部表在創建的時候不需要添加關鍵詞)
存儲在hive.metastore.warehourse.dir (默認) 可以通過location進行制定路徑? 表刪除,元數據和數據也刪除
外部表–external
? 數據存在外部,刪除是,只刪除元數據,不會對數據有影響,可能數據以前就存在了
describe 表, 查看表的描述
或者describe formatted 表 查看詳細信息
describe extended 表 查看詳細信息
java對象 —> 序列化 >> json
(傳統)
記錄 >> hdfs (序列化–持久化)
row formatted delimited
后面加分隔符
如 filed terminated by ’ ,’
collection terminated by ‘-’
將本地文件加載到數據表中,使用表中設置
hive > load data local inpath ‘root/xx.txt’ into table tb_user1
ctreate table xx like ex_XX : 復制表,無數據
create table xx as select * from xx: 復制表,有數據
分區的目的:為了更快從數據庫中拿出想要的數據
分區就是先創建目錄,再把數據放進去
create tablex (id int,content String) partitioned by(dt string,hour string)
雙分區,以dt為目錄,子目錄為hour
單分區 partionteed by (dt string)
dt目錄
alter table tb_user5 add partiton (age=36,sex=“female”)
alter table tb drop
alter table tb_user5 drop partition (age=20,sex=male),(age=21,sex=female)
刪除單分區的兩個區數據:
aleter table tabn drop partiton (age=20),partiton (age=21)
show parations 表名稱
msck repair
后面可以加分區
delete 需要 事務,hive默認不支持事務,所以默認不能使用delete命令
truncate不需要事務,可以使用truncate table xxx 進行清空表(截斷)
beeline和hiveServer2 進行配合使用
1 ,在node3上啟動hiveServer2
!close 退出鏈接
!quit 退出程序
ctrl+v 然后輸入!xmllint -format -,記得刪除第一行xml的,這個命令會自動生成一個xml的頭
load命令的使用和區別
load data inpath ‘/test/data.txt’ into table day_table partition(dt=“dt2”); --hdfs 移動文件到hive中
load data local inpath ‘/test/data.txt’ into table day_table partition(dt=“dt2”); --本地上傳(復制)文件到hive中
form tableA(一個mapreduce所以要提前到這個位置)
insert into tableB
select *
inset into tableC
select num where
insert overwrite table D(此處有table關鍵字)
select id,name
數據調優: 減少IO次數,減少IO量
beeline必須和hiveserver2配合使用
①Beeline 要與HiveServer2配合使用
②服務端啟動hiveserver2
③客戶的通過beeline兩種方式連接到hive
a)beeline -u jdbc:hive2://localhost:10000/default -n root
b)beeline
c)beeline> !connect jdbc:hive2://:/;auth=noSasl root 123
④默認 用戶名、密碼不驗證
通過JDBC連接hive
step1: 在服務器上啟動 hiveserver2和hive – sevice metasotre
step2: 編寫java項目,導入hive的jar包,如果不知道導入哪些,全部導入就可以
step3:寫代碼
public class MainClass {private static String dirvername = "org.apache.hive.jdbc.HiveDriver";public static void main(String[] args) throws Exception {// TODO Auto-generated method stubClass.forName(dirvername);String url ="jdbc:hive2://node1:10000/default";String username = "root";String password = "huxiede";Connection conn = DriverManager.getConnection(url,username,password);Statement stmt = conn.createStatement();String sql = "select * from tb_user limit 4";ResultSet executeQuery = stmt.executeQuery(sql);while(executeQuery.next()){System.out.print(executeQuery.getInt(1));System.out.println(executeQuery.getString(2));}}}啟動的時候,千萬不要用其他客戶端連接,可能會出現端口被占用
錯誤如下:
java.sql.SQLException: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000/default: java.net.ConnectException: 拒絕連接其實上另一個客戶端連接著呢,斷開就好
create table wc_result
(
word string,
count int
)
> form (select explode(split(line,’ ')) word from wc) t
> insert into wc_result
> select word,conut(word) group by word;
from (select explode(split(line,’ ')) word from wc) t
insert into wc_result
bc:hive2://localhost:10000/default: java.net.ConnectException: 拒絕連接
其實上另一個客戶端連接著呢,斷開就好create table wc_result> ( > word string,> count int> ) > > form (select explode(split(line,' ')) word from wc) t > > insert into wc_result > > select word,conut(word) group by word;[外鏈圖片轉存中...(img-UShuGLRu-1565614086851)]from (select explode(split(line,' ')) word from wc) tinsert into wc_resultselect word,count(word) group by word;總結
以上是生活随笔為你收集整理的BigBrother的大数据之旅Day 10 hive(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++著名库的比较和学习经验
- 下一篇: 明基逐鹿,SaaS领域的HR奇兵