Hive 指定分隔符,將表導出到本地

hive表的數據源有四種:node

hbasepython

hdfssql

本地apache

其餘hive表vim

 

而hive表自己有兩種:cookie

內部表和外部表。app

而hbase的數據在hive中,能夠創建對應的外部表(參看hive和hbase整合)oop

 

內部表和外部表

區別:刪除時,內部表刪除hadoop上的數據;而外部表不刪,其數據在外部存儲,hive表只是查看數據的形式,看時從外部讀入數據:ui

  內部表:CREATETABLE tab(column1 STRING, column2 STRING);spa

 
外部表:用EXTERNAL 關鍵字,且必須在表結尾指定以下參數

CREATE EXTERNAL TABLE  tab

(column1 STRING,

 column2 STRING

)

 

  ROW FORMAT DELIMITED FIELDS TERMINATED BY'\t'

stored as textfile

location 'hdfs://namenode/tmp/lmj/tab/';

 

分隔符的指定

有兩種方式

(1)DELIMITED方式:

ROW FORMAT DELIMITED

[FIELDS TERMINATED BY char]

[COLLECTION ITEMS TERMINATED BY char]

[MAP KEYS TERMINATED BY char]

[LINES TERMINATED BY char]

 

(2)SERDE方式:

SERDE serde_name [WITH SERDEPROPERTIES(property_name=property_value, property_name=property_value, ...)]

 

其中,[ROW FORMAT DELIMITED]關鍵字,是設置建表時加載數據所支持的列分隔符;

若是沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,則會自動使用自帶的 SerDe。

另外,建表時,用戶還要爲表指定列,同時也會指定自定義的SerDe,Hive經過SerDe肯定表的具體的列數據。

 

舉例以下:

內部表

        create table user_info (user_id int, cid string,ckid string, username string)
        row format delimited
        fields terminated by '\t'
        lines terminated by '\n';
        

外部表
        CREATE EXTERNAL TABLE test_1(id INT, name STRING, citySTRING)
        SORTED AS TEXTFILE
        ROW FORMAT DELIMITED
        FIELDS TERMINATED BY'\t’
        LOCATION ‘hdfs://http://www.cnblogs.com/..’

文件存儲格式

如上,用關鍵字[STORED AS file_format]設置加載數據的文件類型,默認採用[STORED AS TEXTFILE]。主要格式有

STORED AS

            SEQUENCEFILE

           | TEXTFILE

            |RCFILE   

            |INPUTFORMATinput_format_classname 

OUTPUTFORMAT            output_format_classname

其中用STORED AS TEXTFILE 存儲純文本文件。若是數據須要壓縮,使用 STORED AS SEQUENCE 。Hive自己支持的文件格式只有:Text File,Sequence File。

 

導出到本地:

INSERT OVERWRITE local DIRECTORY '/home/rengang1/jypt/res.csv'

ROW FORMAT DELIMITED FIELDS TERMINATED BY','

select * from dev.dev_jiadian_user_yuge;

---------------------------------------------------------------------

數據導入與導出:
一.數據導入:
1.1導入內部表
(1)本地或者hdfs導入:
        LOAD DATA[LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLEtablename [PARTITION(partcol1=val1, partcol2=val2 ...)]
        區別是看有無關鍵字local,有local表示從本地路徑導入,無local表示從hadoop(hbase或hdfs)導入。
導入的前提是目標表必須存在。若是無表要先建表,再導入:
        CREATE TABLE myword(idSTRING, counts INT, dt STRING) row formatdelimitedfields terminated by ‘\t’;
(2)用hive表的select結果導入
INSERT OVERWRITE TABLE T1 SELECT * FROMT2;

其中,INSERT OVERWRITE TABLE表示覆蓋,刪除原數據;

而INSERT into TABLE 表示增量的插入,不刪除原數據。

另外,

刪除表:drop table if exists T1;

清空表:truncate table T1;

 

1.2 導入外部表:
建表時直接指定數據源(不能指定本地文件,必須是hdfs路徑):
(1)Hdfs上數據導入hive:

	CREATE EXTERNAL TABLE wizad_mdm_dev_lmj_edition_20141120 (
	cookie_id STRING,
	guid STRING
	)      
	 ROWFORMAT DELIMITED
         FIELDSTERMINATEDBY ','
         LINESTERMINATEDBY '\n'
         storedas textfile
       	 LOCATION'/user/wizad/test/lmj/edition_compare/';
        其中,也能夠用全路徑location'hdfs://namenode/user/wizad/test/lmj/edition_compare/';



(2)Hbase上數據導入hive表:

先指定參數

SET mapred.job.queue.name=queue3;

SEThbase.client.scanner.caching=5000;

SEThbase.zookeeper.quorum=datanode06,datanode07,datanode08;

SET zookeeper.znode.parent=/hbase;



有map類型結構,建表時須要指明:

CREATE EXTERNAL TABLE lxw2 (

key string,

value map<STRING,STRING>

)

STORED BY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES("hbase.columns.mapping" =":key,fixeddim:")

TBLPROPERTIES("hbase.table.name"="wizad_mdm_task_geely_hk_20141014"); 

 

查詢結果

SELECT KEY,dim_name,dim_value FROM lxw2

LATERAL VIEW explode(VALUE) myTable1AS dim_name,dim_value

--WHERE KEY = '000000054153796

 

這裏,讀取Hbase庫的數據,可能會導入失敗,由於scan時間過大,能夠設置長時間

sethbase.regionserver.lease.period=180000;



hbase與本地表jion時,可能出現啓動後,無限等待。緣由:


二.數據導出:
三種導出:

(1)導出到其餘hive表:

覆蓋:INSERT OVERWRITE TABLE t1 select * from t2;

不覆蓋:INSERT INTO TABLE t1 select * from t2;

注意hive不支持 子查詢結果直接建表,如 create table t1 as select * from t2; 在hive中是錯誤的



(2)導出到本地,hdfs(有無local):

INSERT OVERWRITE [LOCAL]DIRECTORY directory1 select_statement1

這裏注意:

導出本地時能夠指定列分隔符,

而導出到hdfs上不能夠使用hive默認\001(^A)

導入到hdfs上不能指定列的分隔符:

使用語句ROW FORMAT DELIMITEDFIELDS TERMINATED BY ',' 會報錯,不能識別。

代碼如

INSERT OVERWRITE DIRECTORY'/user/wizad/tmp/mytest'

select * from wizad_mdm_dev_lmj_edition_insterest

由於hive導出到hdfs上,默認使用^A做爲列分隔符,其對應着001。官方文檔:Data written to the filesystem is serialized as text with columns separated by ^A。(因此,python中用line.split('\x01')或者line.split('\001')切分。)

但這樣的數據在pig中沒法讀入,用'\001'或者'\\001'或者'^A'都沒法讀入。

解決辦法:做爲一個列總體讀入後,在用STRSPLIT分隔按'\\001'(使用'^A'無效),能夠返回一個元組相似((a,b)),pig代碼以下

%default interestFlie/user/wizad/tmp/mytest/*

--無效interest_data =LOAD '$interestFlie' USING PigStorage('\\001')

--無效interest_data =LOAD '$interestFlie' USING PigStorage('^A')

interest_data = LOAD '$interestFlie'

AS(cookie_id:chararray

--  guid:chararray,

--  dimkey :chararray,

--  dimvalue:chararray

);

test2 = foreach interest_data generateSTRSPLIT(cookie_id,'\\001');

DUMP res;

describe res;

結果:result結構:{(null)}

((B2BEF56E09EC115456E221,352751019523267,interest_11,161))

((B2BEF56E09EC115456E221,352751019523267,interest_13,102))

((EC15860E09D5EA545700E9,352751019523267,interest_11,161))

((EC15860E09D5EA545700E9,352751019523267,interest_13,102))

((daca0487-5424ef1a0dc3fa-11535481,352751019523267,interest_4,61))

((daca0487-5424ef1a0dc3fa-11535481,352751019523267,interest_21,21))

((daca0487-5424ef1a0dc3fa-11535481,352751019523267,interest_11,161))

((daca0487-5424ef1a0dc3fa-11535481,352751019523267,interest_13,102))

 

 



指定導出全路徑也不行。

INSERT OVERWRITE DIRECTORY'hdfs://namenode/user/wizad/tmp/interest2/'

ROW FORMAT DELIMITED FIELDS TERMINATED BY','

select * fromwizad_mdm_dev_lmj_edition_insterest

 

2導出到本地,能夠指定列分隔符:

INSERT OVERWRITE local DIRECTORY'/home/wizad/lmj/inserest2'

ROW FORMAT DELIMITED FIELDS TERMINATED BY','

select * fromwizad_mdm_dev_lmj_edition_insterest

 

導入到本地可直接用-e命令,默認使用\t分隔:

hive -e 'use wizad;

select * fromwizad_mdm_dev_lmj_edition_insterest;'>> mytest

查詢結果使用\t做爲列分隔符,mytest中

3531 3631 3730 3631 3931 3635 34360969  51617061916546.i

vim中16進制(%!xxd)兩位對應一個字符,看到"."對應的09,在asii碼錶中09,就是tab製表符

 

也能夠用hive -f:

[wyp@master ~/local]$ cat wyp.sql

select * from wyp

[wyp@master ~/local]$ hive -f wyp.sql>> local/wyp2.txt

  

 

參考:https://blog.csdn.net/longshenlmj/article/details/41519503
相關文章
相關標籤/搜索