導航:首頁 > 數據分析 > hive中的源數據都存儲在哪裡

hive中的源數據都存儲在哪裡

發布時間:2022-09-02 02:14:20

Ⅰ hive工作時,數據是存儲在mysql還是hdfs

存儲的數據都在hdfs,元數據等可能存儲於mysql或者deby等

Ⅱ Hive的幾種常見的數據導入方式

零.Hive的幾種常見的數據導入方式
常用的的有三種:
1.從本地文件系統中導入數據到Hive表;
2.從HDFS上導入數據到Hive表;
3.在創建表的時候通過從別的表中查詢出相應的記錄並插入到所創建的表中。
Hive配置:
HDFS中Hive數據文件存放目錄(啟動hive後HDFS自動創建):
HDFS: /usr/hive/warehouse
hadoop fs -mkdir /usr/hive/warehouse 命令創立
本地數據存放目錄:
本地:/home/santiago/data/hive
一.從本地文件系統中導入數據到Hive表
1.在hive中建表
hive> show databases;
OKdefaultTime taken: 1.706 seconds, Fetched: 1 row(s)
hive> create table guo_test(Name string,String string)
> row format delimited
> fields terminated by ','
> stored as textfile;
hive> show tables;
OK
guo_test
Time taken: 0.024 seconds, Fetched: 1 row(s)123456789101112

2.在本地文件建立同類型數據表
santi@hdp:~/data/hive$ ls
hive_test.txt
santi@hdp:~/data/hive$ cat hive_test.txt
santi,you are a zhazha.1234

3.導入數據並測試
hive>load data local inpath '/home/santi/data/hive/hive_test.txt' into table guo_test;
hive> select * from guo_test;
hive>dfs -ls /usr/hive/warehouse/guo_test;

#hadoop fs -ls /usr/hive/warehouse
Found 1 items
drwxrwxr-x - santiago supergroup 0 2017-01-14 21:13
/usr/hive/warehouse/guo_test12345678

發現hive-site,xml設置的HDFS文件存儲位置中多了guo_test這個文件夾
#hadoop fs -ls /usr/hive/warehouse/guo_test
Found 1 items-rwxrwxr-x 1 santiago supergroup 24 2017-01-14 21:13
/usr/hive/warehouse/guo_test/hive_test.txt

hive> select * from guo_test;
OK
santi you are a zhazha.12345678

在該文件夾中找到了所寫入hive數據倉庫的文件。
[注]本地數據寫入成功,但是從本地將數據導入到Hive表的過程中,其實是先將數據臨時復制到HDFS的一個目錄下(典型的情況是復制到上傳用戶的HDFS home目錄下,比如/home/santi/),然後再將數據從臨時目錄下移動到對應的Hive表的數據目錄裡面(臨時目錄不保留數據)。
二.從HDFS文件系統中導入數據到Hive表
1.在HDFS文件系統上建立數據文件
hdfs上沒有vim命令,則需要將本地數據文件手動傳入到HDFS上
/data/hive# vim data_HDtoHive/data/hive# cat data_HDtoHivedata from, HDFS to Hive #hadoop fs -put /home/santi/data/hive/data_HDtoHive /usr/data/input//數據傳入# hadoop fs -ls /usr/data/input12345

2導入數據
hive> load data inpath '/usr/data/input/data_HDtoHive' into table guo_test;
hive> select * from guo_test;
OK
data from HDFS to Hive
santi you are a zhazha.
Time taken: 0.172 seconds, Fetched: 2 row(s)123456

數據寫入成功
數據存hive配置的數據存儲位置中。
[注]
從本地導入數據語句為
hive>load data local inpath 『/home/santi/data/hive/hive_test.txt』 into table guo_test;
從HDFS中導入數據的語句為
hive> load data inpath 『/usr/data/input/data_HDtoHive』 into table guo_test;
差距在local這個命令這里。
而從HDFS系統上導入到Hive表的時候,數據轉移。HDFS系統上查找不到相關文件。
三.從HIVE表選取數據插入新的HIVE表
命令為create table 表名 as selecr xxx from 表名。
hive> create table hivedata_test1
> as
> select name
> from guo_test;
hive> select * from hivedata_test1;
OK
data fromsanti
Time taken: 0.116 seconds, Fetched: 2 row(s)123456789

[注]hive是分區表有稍微區別
在Hive中,表的每一個分區對應表下的相應目錄,所有分區的數據都是存儲在對應的目錄中。比表有a和b兩個分區,則對應a=xxx,b=xx對應表的目錄為/user/hive/warehouse/a=xxx
user/hive/warehouse/b=xx,所有屬於這個分區的數據都存放在這個目錄中。
hive> create table hivedata_test2(
> Name string)
> partitioned by
> (String string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ','> STORED AS TEXTFILE;

hive> insert into table hivedata_test2
> partition(String='best')
> select Name
> from guo_test;
hive> select * from hivedata_test2;
OK
data from best
santi best
Time taken: 1.549 seconds, Fetched: 2 row(s)# hadoop fs -ls /usr/hive/warehouse/hivedata_test2Found 1 items
drwxrwxr-x -santiago supergroup 0 2017-02-14 17:40
/usr/hive/warehouse/hivedata_test2/string=best

Ⅲ Hive元資料庫是用來做什麼的,存儲哪些信息

本質上只是用來存儲hive中有哪些資料庫,哪些表,表的模式,目錄,分區,索引以及命名空間。為資料庫創建的目錄一般在hive數據倉庫目錄下。

Ⅳ hive能存儲數據嗎

能,hive的存儲位置是HDFS

Ⅳ hive 的元數據存儲在 derby 和 mysql 中有什麼區別

Hive 的元數據存儲在RDBMS中,一般常用 MySQL 和 Derby。默認情況下,Hive元數據保存在內嵌的 Derby 資料庫中,只能允許一個會話連接,只適合簡單的測試。實際生產環境中不適用,為了支持多用戶回話,需要一個獨立的元資料庫,所以使用 MySQL。
總結:
1、Derby 只支持一個會話連接
2、 MySQL 支持多個會話連接,並且可以獨立部署

Ⅵ 分布式環境下hive的外部表是如何存儲的

第一、hive本身是不存復儲數據的,不論外製表、內表,hive的所有數據是存放在hdfs文件系統的。
第二、基於上面,你的問題就轉變為hdfs的文件是如何存儲的了,hdfs的文件是以塊block存儲的,每個塊分布在多台機器上面,每個塊的信息以及存放路徑則存放在nameNode節點的元數據里邊。

Ⅶ 如何查看hive的元數據存儲位置

導入數據設置HADOOP_HOME
$ HADOOP_HOME=/path/to/some/hadoop sqoop import --arguments...
下載合適的Sqoop並解壓到硬碟,所謂合適即Sqoop的版本應該和Hadoop的版本相匹配。筆者的Hadoop版本是1.03,下載的Sqoop是版本1.4.2。
$ tar zvxf sqoop-1.4.2.bin__hadoop-1.0.0.tar.gz

下載合適的JDBC驅動,將下載的JDBC的驅動放到Sqoop的lib文件夾下。
導入數據
$ sqoop import --hive-import --connect jdbc:oracle:thin:@192.168.56.111:1521:DBNAME --username USERNAME --password PASSWORD --verbose -m 1 --table TABLENAME
DBNAME:資料庫名
USERNAME:用戶名
PASSWORD:密碼
TABLENAME:表名
-m:導入數據的進程的並發數,默認是4。如果導入的數據不大的話,不妨設置成1,這樣導入更快。一般來說Sqoop會使用主鍵來平均地分割數據。並發導入的時候可以設置相關的分割列等等,具體的做法參考官方的文檔。
如果Oracle是安裝在遠程的電腦上,要確保Sqoop可以ping通Oracle所在的電腦。例如如果Oracle安裝在Win7上面,可能需要關閉Win7的防火牆。另外,需要將Oracle配置成可以遠程訪問的。

注意,用戶名和表名應該要是大寫的,除非它們在創建的時候是名字是放在引號中的大小寫混合的形式。

Ⅷ hive的元數據存儲在derby和mysql 中有什麼區別

hive的元數據如果放在derby,一般只能允許1個會話連接;而mysql則沒有這個限制;為了共享知識,請點個贊支持下

Ⅸ (四)Hive分區、分桶

CREATE TABLE IF NOT EXISTS salgrade2 (
GRADE int,
LOSAL int,
HISAL int
) partitioned by (day string)
row format delimited fields terminated by '\t'
location '/data/inner/ODS/01/salgrade2';

CREATE TABLE IF NOT EXISTS salgrade3 (
GRADE int,
LOSAL int,
HISAL int
) partitioned by (day string,code string)
row format delimited fields terminated by '\t'
location '/data/inner/ODS/01/salgrade3';

// 載入一次,文件就要put一次,每次載入都會直接移動源文件
hadoop fs -put ./salgrade.txt /data/inner/RAW/01/salgrade

//另外指定分區名
load data inpath '/data/inner/RAW/01/salgrade/salgrade.txt' into table salgrade2 partition (day='99990101');
load data inpath '/data/inner/RAW/01/salgrade/salgrade.txt' into table salgrade3 partition (day='99990101',code='01');
load data inpath '/data/inner/RAW/01/salgrade/salgrade.txt' into table salgrade2 partition (day='20200703');

// 先進行分區,再執行腳本導入表的數據
alter table salgrade2 add partiton (day='99990102');
load data inpath '/data/inner/RAW/01/salgrade/salgrade.txt' into table salgrade2 partition (day='99990102');

// 需要加上hivevar
select * from salgrade2 where day='${YYYYMMDD}';
// 查詢具體分區下的數據
select * from salgrade2 where day='99990101';

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

create table if not exists salgrade4 like salgrade2;

insert overwrite table salgrade4 partition (day='20200520') select GRADE, LOSAL, HISAL from salgrade2 where day='99990101';

// 顯示如下內容:
INFO : Number of rece tasks is set to 0 since there is no rece operator
INFO : number of splits:1
INFO : Submitting tokens for job: job_1593741356151_0001
INFO : The url to track the job: http://bd1601:8088/proxy/application_1593741356151_0001/
INFO : Starting Job = job_1593741356151_0001, Tracking URL = http://bd1601:8088/proxy/application_1593741356151_0001/
INFO : Kill Command = /opt/bdp/hadoop-2.6.5/bin/hadoop job -kill job_1593741356151_0001
INFO : Hadoop job information for Stage-1: number of mappers: 1; number of recers: 0
INFO : 2020-07-03 08:09:51,082 Stage-1 map = 0%, rece = 0%
INFO : 2020-07-03 08:10:12,868 Stage-1 map = 100%, rece = 0%, Cumulative CPU 3.06 sec
INFO : MapRece Total cumulative CPU time: 3 seconds 60 msec
INFO : Ended Job = job_1593741356151_0001
INFO : Stage-4 is selected by condition resolver.
INFO : Stage-3 is filtered out by condition resolver.
INFO : Stage-5 is filtered out by condition resolver.
INFO : Moving data to: hdfs://bdp/bdp/hive/metastore/warehouse/salgrade4/day=20200520/.hive-staging_hive_2020-07-03_08-09-17_320_8093467842238301801-2/-ext-10000 from hdfs://bdp/bdp/hive/metastore/warehouse/salgrade4/day=20200520/.hive-staging_hive_2020-07-03_08-09-17_320_8093467842238301801-2/-ext-10002
INFO : Loading data to table default.salgrade4 partition (day=20200520) from hdfs://bdp/bdp/hive/metastore/warehouse/salgrade4/day=20200520/.hive-staging_hive_2020-07-03_08-09-17_320_8093467842238301801-2/-ext-10000
INFO : Partition default.salgrade4{day=20200520} stats: [numFiles=1, numRows=5, totalSize=59, rawDataSize=54]
No rows affected (60.04 seconds)

set hive.support.quoted.identifiers=none; `(membership_level|extra_info)?+.+
insert overwrite table salgrade4 partition (day) select * from salgrade2 where day='99990101';

CREATE EXTERNAL TABLE IF NOT EXISTS emp2 (
EMPNO int,
ENAME varchar(255),
JOB varchar(255),
MGR int,
HIREDATE date,
SAL decimal(10,0),
COMM decimal(10,0),
DEPTNO int
) partitioned by (id string)
row format delimited fields terminated by '\t'
location '/data/inner/ODS/01/emp2';

// 報錯
insert overwrite table emp2 partition(id) select * from emp;
insert overwrite table emp2 partition(id) select *,EMPNO id from emp;

創建表:
CREATE TABLE IF NOT EXISTS salgrade_test (
GRADE int,
LOSAL int,
HISAL int,
day string
) row format delimited fields terminated by '\t'
location '/data/inner/ODS/01/salgrade_test';

在本地有一個文件/data/a.txt其中有如下文本內容:
1 700 1200 10100101
2 1201 1400 10100101
3 1401 2000 10100101
4 2001 3000 10100102
5 3001 9999 10100102

載入數據:
load data inpath '/data/inner/ODS/01/salgrade_test/a.txt' into table salgrade_test;

插入數據到salgrade_test:
insert into table salgrade4 partition(day) select * from salgrade_test;

分區、分桶的作用:

我們知道在傳統的DBMs系統中,一般都具有表分區的功能,通過表分區能夠在特定的區域檢索數據,減少掃描成本,在一定程度上提高了查詢效率,當然我們還可以通過進一步在分區上建立索引,進一步提高查詢效率。

在Hive中的數據倉庫中,也有分區分桶的概念,在邏輯上,分區表與未分區表沒有區別,在物理上分區表會將數據按照分區間的列值存儲在表目錄的子目錄中,目錄名=「分區鍵=鍵值」。其中需要注意的是分區鍵的列值存儲在表目錄的子目錄中,目錄名=「分區鍵=鍵值」。其中需要注意的是分區鍵的值不一定要基於表的某一列(欄位),它可以指定任意值,只要查詢的時候指定相應的分區鍵來查詢即可。我們可以對分區進行添加、刪除、重命名、清空等操作。

分桶則是指定分桶表的某一列,讓該列數據按照哈希取模的方式隨機、均勻的分發到各個桶文件中。因為分桶操作需要根據某一列具體數據來進行哈希取模操作,故指定的分桶列必須基於表中的某一列(欄位)。分桶改變了數據的存儲方式,它會把哈希取模相同或者在某一個區間的數據行放在同一個桶文件中。如此一來便可以提高查詢效率。如果我們需要對兩張在同一個列上進行了分桶操作的表進行JOIN操作的時候,只需要對保存相同列值的通進行JOIN操作即可。

還有一點需要點一下:在hive中的數據是存儲在hdfs中的,我們知道hdfs中的數據是不允許修改只能追加的,那麼在hive中執行數據修改的命令時,就只能先找到對應的文件,讀取後執行修改操作,然後重新寫一份文件。如果文件比較大,就需要大量的IO讀寫。在hive中採用了分桶的策略,只需要找到文件存放對應的桶,然後讀取再修改寫入即可。

分區:

hive中分區分為 : 單值分區、范圍分區。
單值分區: 靜態分區 動態分區

如下所示,現在有一張persionrank表,記錄每個人的評級,有id、name、score欄位。我們可以創建分區rank(rank不是表中的列,我們可以把它當做虛擬列),並將相應的數據導入指定分區(將數據插入指定目錄)。

單值分區:

單值靜態分區:導入數據時需要手動指定分區
單值動態分區:導入數據時,系統可以動態判斷目標分區

1.靜態分區創建:
直接在PARTITI1ONED BY後面跟上分區鍵、類型即可(指定的分區鍵不能出現在定義列名中)

CREATE [EXTERNAL] TABLE <table_name>
(<col_name> <data_type> [, <col_name> <data_type> ...])
-- 指定分區鍵和數據類型
PARTITIONED BY (<partition_key> <data_type>, ...)
[CLUSTERED BY ...]
[ROW FORMAT <row_format>]
[STORED AS TEXTFILE|ORC|CSVFILE]
[LOCATION '<file_path>']
[TBLPROPERTIES ('<property_name>'='<property_value>', ...)];

2.靜態分區寫入:
-- 覆蓋寫入
INSERT OVERWRITE TABLE <table_name>
PARTITION (<partition_key>=<partition_value>[, <partition_key>=<partition_value>, ...])
SELECT <select_statement>;

-- 追加寫入
INSERT INTO TABLE <table_name>
PARTITION (<partition_key>=<partition_value>[, <partition_key>=<partition_value>, ...])
SELECT <select_statement>;

3.添加分區:
//只能添加分區列的值,不能添加分區列,如果是多個分區列,不能單獨添加其中一個
alter table tablename add partition(col=value)

4.刪除分區:
//可以刪除一個分區列,但是會把表中所有包含當前分區列的數據全部刪除
alter table tablename drop partition(col=value)

5.修復分區:
//手動向hdfs中創建分區目錄,添加數據,創建好hive的外表之後,無法載入數據,
//元數據中沒有相應的記錄
msck repair table tablename

6.動態分區創建:
創建方式與靜態分區表完全一樣,一張表可同時被靜態分區和動態分區鍵分區,只是動態分區鍵需要放在靜態分區鍵的後面(HDFS上的動態分區目錄下不能包含靜態分區的子目錄),如下spk即static partition key(靜態分區鍵),dpk為dynamic partition key(動態分區鍵)

CREATE TABLE <table_name>
PARTITIONED BY ([<spk> <data_type>, ... ,] <dpk> <data_type>, [<dpk>
<data_type>,...]);

7.動態分區寫入:
根據表中的某一個列值來確定hdfs存儲的目錄:

優點:
動態可變,不需要人為控制。假如設定的是日期,那麼每一天的數據會單獨存儲在一個文件夾中

缺點:
需要依靠MR完成,執行比較慢

靜態分區鍵要用 <spk>=<value> 指定分區值;動態分區只需要給出分出分區鍵名稱 <dpk>。

-- 開啟動態分區支持,並設置最大分區數
set hive.exec.dynamic.partition=true;
//set hive.exec.dynamic.partition.mode=nostrict;
set hive.exec.max.dynamic.partitions=2000;

insert into table1 select 普通欄位 分區欄位 from table2
范圍分區:

單值分區每個分區對應於分區鍵的一個取值,而每個范圍分區則對應分區鍵的一個區間,只要落在指定區間內的記錄都被存儲在對應的分區下。分區范圍需要手動指定,分區的范圍為前閉後開區間 [最小值, 最大值)。最後出現的分區可以使用 MAXVALUE 作為上限,MAXVALUE 代表該分區鍵的數據類型所允許的最大值。

CREATE [EXTERNAL] TABLE <table_name>
(<col_name> <data_type>, <col_name> <data_type>, ...)
PARTITIONED BY RANGE (<partition_key> <data_type>, ...)
(PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>),
[PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>),
...
]
PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>|MAXVALUE)
)
[ROW FORMAT <row_format>] [STORED AS TEXTFILE|ORC|CSVFILE]
[LOCATION '<file_path>']
[TBLPROPERTIES ('<property_name>'='<property_value>', ...)];
多個范圍分區鍵的情況:

DROP TABLE IF EXISTS test_demo;
CREATE TABLE test_demo (value INT)
PARTITIONED BY RANGE (id1 INT, id2 INT, id3 INT)
(
-- id1在(--∞,5]之間,id2在(-∞,105]之間,id3在(-∞,205]之間
PARTITION p5_105_205 VALUES LESS THAN (5, 105, 205),
-- id1在(--∞,5]之間,id2在(-∞,105]之間,id3在(205,215]之間
PARTITION p5_105_215 VALUES LESS THAN (5, 105, 215),
PARTITION p5_115_max VALUES LESS THAN (5, 115, MAXVALUE),
PARTITION p10_115_205 VALUES LESS THAN (10, 115, 205),
PARTITION p10_115_215 VALUES LESS THAN (10, 115, 215),
PARTITION pall_max values less than (MAXVALUE, MAXVALUE, MAXVALUE)
);
分桶:

對Hive(Inceptor)表分桶可以將表中記錄按分桶鍵的哈希值分散進多個文件中,這些小文件稱為桶。

1.創建分桶表:
分桶表的建表有三種方式:直接建表,CREATE TABLE LIKE 和 CREATE TABLE AS SELECT ,單值分區表不能用 CREATE TABLE AS SELECT 建表。這里以直接建表為例:

CREATE [EXTERNAL] TABLE <table_name>
(<col_name> <data_type> [, <col_name> <data_type> ...])]
[PARTITIONED BY ...]
CLUSTERED BY (<col_name>)
[SORTED BY (<col_name> [ASC|DESC] [, <col_name> [ASC|DESC]...])]

分桶鍵只能有一個即<col_name>。表可以同時分區和分桶,當表分區時,每個分區下都會有<num_buckets> 個桶。我們也可以選擇使用 SORTED BY … 在桶內排序,排序鍵和分桶鍵無需相同。ASC 為升序選項,DESC 為降序選項,默認排序方式是升序。<num_buckets> 指定分桶個數,也就是表目錄下小文件的個數。

2.向分桶表中寫數據:
因為分桶表在創建的時候只會定義Scheme,且寫入數據的時候不會自動進行分桶、排序,需要人工先進行分桶、排序後再寫入數據。確保目標表中的數據和它定義的分布一致。

方法一:打開enforce bucketing開關。
SET hive.enforce.bucketing=true;
INSERT (INTO|OVERWRITE) TABLE <bucketed_table> SELECT <select_statement>
[SORT BY <sort_key> [ASC|DESC], [<sort_key> [ASC|DESC], ...]];

方法二:將recer個數設置為目標表的桶數,並在 SELECT 語句中用 DISTRIBUTE BY <bucket_key>對查詢結果按目標表的分桶鍵分進recer中。
SET mapred.rece.tasks = <num_buckets>;
INSERT (INTO|OVERWRITE) TABLE <bucketed_table>
SELECT <select_statement>
DISTRIBUTE BY <bucket_key>, [<bucket_key>, ...]
[SORT BY <sort_key> [ASC|DESC], [<sort_key> [ASC|DESC], ...]];
如果分桶表創建時定義了排序鍵,那麼數據不僅要分桶,還要排序

如果分桶鍵和排序鍵不同,且按降序排列,使用Distribute by … Sort by分桶排序
如果分桶鍵和排序鍵相同,且按升序排列(默認),使用 Cluster by 分桶排序,即如下:

SET mapred.rece.tasks = <num_buckets>;
INSERT (INTO|OVERWRITE) TABLE <bucketed_table>
SELECT <select_statement>
CLUSTER BY <bucket_sort_key>, [<bucket_sort_key>, ...];
抽樣語句 :tablesample(bucket x out of y)

tablesample是抽樣語句,語法:tablesample(bucket x out of y),y必須是table總共bucket數的倍數或者因子。Hive根據y的大小,決定抽樣的比例。例如:table總共分了64份,當y=32時,抽取2(64/32)個bucket的數據,當y=128時,抽取1/2(64/128)個bucket的數據。x表示從哪個bucket開始抽取。例如:table總共bucket數為32,tablesample(bucket 3 out of 16)表示總共抽取2(32/16)個bucket的數據,分別為第三個bucket和第19(3+16)個bucket的數據。

閱讀全文

與hive中的源數據都存儲在哪裡相關的資料

熱點內容
python批量下載oa文件夾 瀏覽:488
xml文件怎麼輸入內容 瀏覽:392
三星手機加密文件夾 瀏覽:1000
cvi例子在哪個文件夾 瀏覽:18
好玩的蘋果商店塔防游戲排行榜 瀏覽:797
snow密碼錯誤怎麼辦 瀏覽:733
電腦主機如何存儲數據2年 瀏覽:456
學校網路是什麼模式 瀏覽:330
電腦微信config文件能刪除嘛 瀏覽:312
如何下載蘇州道app 瀏覽:382
網路接入服務商查詢 瀏覽:370
全球網大數據天眼系統是什麼 瀏覽:2
word2007顯示批註 瀏覽:177
xlsm宏文件如何使用 瀏覽:761
db2資料庫連接池如何重連 瀏覽:7
安卓蘋果換機傳文件 瀏覽:562
win10對話框不全 瀏覽:614
iphone4刪除不了照片 瀏覽:803
安卓faceriglive2d 瀏覽:736
sas大數據累加高位溢出 瀏覽:777

友情鏈接