hive創建資料庫
① hive資料庫怎麼建表和數據裝載
樓主說的是Hive,不是HBase。從Oracle裡面頭導出數據為平面文件後,導入HDFS裡面。Hive裡面的表結構是要自己手工定的。
建表可以自己寫個小程序實現,根據oracle字典表和hive的建表規則,每個地方使用hive的情景不同,建表也不同。數據裝載可以用sqoop來實現。
你可以安裝下SQOOP,注意這個跟HADOOP的版本要對應的,不然會出現一些問題。以下是我項目用到的例子,不過我有個更高級的方法,只需配到表就行了,就是寫個java程序,然後自動生成對應的腳本,再執行就可以了。轉載,僅供參考。
② 提問為什麼我要創建一個資料庫創建不出來求解,怎麼辦
1、mysql錯誤碼1044,許可權錯誤
當用root創建新資料庫時,發現很奇怪的問題,root許可權居然無法創建資料庫,看了網上很多文檔說是root創建密碼問題,按照網上方法修改仍然沒有起效
後來發現自已原來安裝過mysql,已經創建了var/lib/mysql 文件夾,然後卸載重裝沒有刪除這個文件夾,這個文件夾裡面的mysql許可權文件是原來的mysql用戶的,新的mysql用戶雖然用戶名也是mysql,但是ID是不一樣的,當然無法訪問原來的文件,於是發原來的mysql文件夾刪掉,重新安裝mysql,問題解決
2、啟動mysql失敗,提示:The server quit without updating PID file
查看err文件,提示是設置utf-8字元問題,原因是我在mysqld 下面用了:default-character-set=utf8
導致啟動失敗
進入/etc/my.cnf文件,把設置utf-8字元的那行刪掉,mysqld下面如果要使用utf-8,設置應該為:
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
問題解決
3、創建新資料庫hive,創建用戶hive,並授權hive資料庫許可權給hive用戶後,發現使用hive用戶登錄時報錯:
ERROR 1045 (28000): Access denied for user 'hive'@'localhost' (using password: YES)
這是因為user表中有用戶名為空的用戶導致,把user表中的空用戶刪除,刷新,問題解決
執行命令如下:
delete from user where user='';
FLUSH PRIVILEGES;
③ hive創建資料庫表 報錯,如截圖,請大神賜教!
跟字元集沒有關系,這個表並沒有創建成功。
參考:
④ Hive 資料庫表的基本操作,必須掌握的基本功
說明:hive 的表存放位置模式是由 hive-site.xml 當中的一個屬性指定的,默認是存放在該配置文件設置的路徑下,也可在創建資料庫時單獨指定存儲路徑。
資料庫有一些描述性的屬性信息,可以在創建時添加:
查看資料庫的鍵值對信息
修改資料庫的鍵值對信息
與mysql查詢語句是一樣的語法
刪除一個空資料庫,如果資料庫下面有數據表,那麼就會報錯
強制刪除資料庫,包含資料庫下面的表一起刪除(請謹慎操作)
[]里的屬性為可選屬性,不是必須的,但是如果有可選屬性,會使 sql 語句的易讀性更好,更標准與規范。
例如:[comment '欄位注釋信息'][comment '表的描述信息']等,[external]屬性除外
1. CREATE TABLE
創建一個指定名字的表,如果相同名字的表已存在,則拋出異常提示:表已存在,使用時可以使用IF NOT EXISTS語句來忽略這個異常。
如果創建的表名已存在,則不會再創建,也不會拋出異常提示:表已存在。否則則自動創建該表。
2. EXTERNAL
顧名思義是外部的意思,此關鍵字在建表語句中讓使用者可以創建一個外部表,如果不加該關鍵字,則默認創建內部表。
外部表在創建時必須同時指定一個指向實際數據的路徑(LOCATION),Hive在創建內部表時,會將數據移動到數據倉庫指向的路徑;
若創建外部表,僅記錄數據所在的路徑,不對數據的位置作任何改變。
內部表在刪除後,其元數據和數據都會被一起刪除。
外部表在刪除後,只刪除其元數據,數據不會被刪除。
3. COMMENT
用於給表的各個欄位或整張表的內容作解釋說明的,便於他人理解其含義。
4. PARTITIONED BY
區分表是否是分區表的關鍵欄位,依據具體欄位名和類型來決定表的分區欄位。
5. CLUSTERED BY
依據column_name對表進行分桶,在 Hive 中對於每一張表或分區,Hive 可以通過分桶的方式將數據以更細粒度進行數據范圍劃分。Hive採用對列值哈希,然後除以桶的個數求余的方式決定該條記錄存放在哪個桶當中。
6. SORTED BY
指定表數據的排序欄位和排序規則,是正序還是倒序排列。
7. ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
指定表存儲中列的分隔符,這里指定的是' ',也可以是其他分隔符。
8. STORED AS SEQUENCEFILE|TEXTFILE|RCFILE
指定表的存儲格式,如果文件數據是純文本格式,可以使用STORED AS TEXTFILE,如果數據需要壓縮,則可以使用STORED AS SEQUENCEFILE。
9. LOCATION
指定 Hive 表在 hdfs 里的存儲路徑,一般內部表(Managed Table)不需要自定義,使用配置文件中設置的路徑即可。
如果創建的是一張外部表,則需要單獨指定一個路徑。
1. 使用create table語句創建表
例子:
2. 使用create table ... as select...語句創建表
例子:
使用 create table ... as select ...語句來創建新表sub_student,此時sub_student 表的結構及表數據與 t_student 表一模一樣, 相當於直接將 t_student 的表結構和表數據復制一份到 sub_student 表。
注意:
(1). select 中選取的列名(如果是 * 則表示選取所有列名)會作為新表 sub_student 的列名。
(2). 該種創建表的方式會改變表的屬性以及結構,例如不能是外部表,只能是內部表,也不支持分區、分桶。
如果as select後的表是分區表,並且使用select *,則分區欄位在新表裡只是作為欄位存在,而不是作為分區欄位存在。
在使用該種方式創建時,create 與 table 之間不能加 external 關鍵字,即不能通過該種方式創建外部目標表,默認只支持創建內部目標表。
(3). 該種創建表的方式所創建的目標表存儲格式會變成默認的格式textfile。
3.使用like語句創建表
例子:
注意:
(1). 只是將 t_student 的表結構復制給 sub1_student 表。
(2). 並不復制 t_student 表的數據給 sub1_student 表。
(3). 目標表可以創建為外部表,即:
⑤ db.properties怎麼創建
解決辦法:1.創建資料庫
hive>create database myhive;
hive>create database if not exists myhive;
2.查詢資料庫和表
hive>show databases;
hive>show tables;
使用正則表達式:
hive>show databases like 'h.*';
3.修改資料庫默認位置
hive>create database myhive
>location 'my/myhive.db'; //要指定資料庫名
1)為資料庫增加描述信息
hive>create database myhive
>comment 'this is my';
hive> desc database myhive; //顯示詳細信息
2)增加一些和其相關的鍵-值對屬性信息
hive>create database myhive
>with dbproperties('name'='lu','data'='2012-01-02');
查看:hive>desc database extended myhive;
hive>use default;
⑥ Hive入門概述
1.1 什麼是Hive
Hive:由Facebook開源用於解決海量結構化日誌的數據統計。
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張表,並提供類SQL查詢功能。本質是:將HQL轉化成MapRece程序
Hive處理的數據存儲在HDFS
Hive分析數據底層的實現是MapRece
執行程序運行在Yarn上
1.2 Hive的優缺點
1.2.1 優點
操作介面採用類SQL語法,提供快速開發的能力(簡單、容易上手)。
避免了去寫MapRece,減少開發人員的學習成本。
Hive的執行延遲比較高,因此Hive常用於數據分析,對實時性要求不高的場合。
Hive優勢在於處理大數據,對於處理小數據沒有優勢,因為Hive的執行延遲比較高。
Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數。
1.2.2 缺點
1.Hive的HQL表達能力有限
(1)迭代式演算法無法表達
(2)數據挖掘方面不擅長
2.Hive的效率比較低
(1)Hive自動生成的MapRece作業,通常情況下不夠智能化
(2)Hive調優比較困難,粒度較粗
1.3 Hive架構原理
1.用戶介面:Client
CLI(hive shell)、JDBC/ODBC(java訪問hive)、WEBUI(瀏覽器訪問hive)
2.元數據:Metastore
元數據包括:表名、表所屬的資料庫(默認是default)、表的擁有者、列/分區欄位、表的類型(是否是外部表)、表的數據所在目錄等;
默認存儲在自帶的derby資料庫中,推薦使用MySQL替代derby存儲Metastore
3.Hadoop
使用HDFS進行存儲,使用MapRece進行計算。
4.驅動器:Driver
(1)解析器(SQL Parser):將SQL字元串轉換成抽象語法樹AST,這一步一般都用第三方工具庫完成,比如antlr;對AST進行語法分析,比如表是否存在、欄位是否存在、SQL語義是否有誤。
(2)編譯器(Physical Plan):將AST編譯生成邏輯執行計劃。
(3)優化器(Query Optimizer):對邏輯執行計劃進行優化。
(4)執行器(Execution):把邏輯執行計劃轉換成可以運行的物理計劃。對於Hive來說,就是MR/Spark。
Hive通過給用戶提供的一系列交互介面,接收到用戶的指令(SQL),使用自己的Driver,結合元數據(MetaStore),將這些指令翻譯成MapRece,提交到Hadoop中執行,最後,將執行返回的結果輸出到用戶交互介面。
1.4 Hive和資料庫比較
由於 Hive 採用了類似SQL 的查詢語言 HQL(Hive Query Language),因此很容易將 Hive 理解為資料庫。其實從結構上來看,Hive 和資料庫除了擁有類似的查詢語言,再無類似之處。本文將從多個方面來闡述 Hive 和資料庫的差異。資料庫可以用在 Online 的應用中,但是Hive 是為數據倉庫而設計的,清楚這一點,有助於從應用角度理解 Hive 的特性。
1.4.1 查詢語言
由於SQL被廣泛的應用在數據倉庫中,因此,專門針對Hive的特性設計了類SQL的查詢語言HQL。熟悉SQL開發的開發者可以很方便的使用Hive進行開發。
1.4.2 數據存儲位置
Hive 是建立在 Hadoop 之上的,所有 Hive 的數據都是存儲在 HDFS 中的。而資料庫則可以將數據保存在塊設備或者本地文件系統中。
1.4.3 數據更新
由於Hive是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive中不建議對數據的改寫,所有的數據都是在載入的時候確定好的。而資料庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO … VALUES 添加數據,使用 UPDATE … SET修改數據。
1.4.4 索引
Hive在載入數據的過程中不會對數據進行任何處理,甚至不會對數據進行掃描,因此也沒有對數據中的某些Key建立索引。Hive要訪問數據中滿足條件的特定值時,需要暴力掃描整個數據,因此訪問延遲較高。由於 MapRece 的引入, Hive 可以並行訪問數據,因此即使沒有索引,對於大數據量的訪問,Hive 仍然可以體現出優勢。資料庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特定條件的數據的訪問,資料庫可以有很高的效率,較低的延遲。由於數據的訪問延遲較高,決定了 Hive 不適合在線數據查詢。
1.4.5 執行
Hive中大多數查詢的執行是通過 Hadoop 提供的 MapRece 來實現的。而資料庫通常有自己的執行引擎。
1.4.6 執行延遲
Hive 在查詢數據的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapRece框架。由於MapRece 本身具有較高的延遲,因此在利用MapRece 執行Hive查詢時,也會有較高的延遲。相對的,資料庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過資料庫的處理能力的時候,Hive的並行計算顯然能體現出優勢。
1.4.7 可擴展性
由於Hive是建立在Hadoop之上的,因此Hive的可擴展性是和Hadoop的可擴展性是一致的(世界上最大的Hadoop 集群在 Yahoo!,2009年的規模在4000 台節點左右)。而資料庫由於 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的並行資料庫 Oracle 在理論上的擴展能力也只有100台左右。
1.4.8 數據規模
由於Hive建立在集群上並可以利用MapRece進行並行計算,因此可以支持很大規模的數據;對應的,資料庫可以支持的數據規模較小。