hive表分隔符修改實操 相容sqoop

2021-10-05 20:27:57 字數 4069 閱讀 5658

hive1.1.0-cdh5.16.2

sqoop 1.4.7

通過如下語句修改分隔符,(網上很多文章只修改了一處,無法識別sqoop過來的資料)

#修改分隔符為逗號 ,

alter table table_name set serdeproperties ('field.delim'=',' , 'serialization.format'=',');

#修改分隔符為\001,在linux的vim中顯示為^a,是hive預設的分隔符

alter table table_name set serdeproperties ('field.delim'='\001' , 'serialization.format'='\001');

#修改分隔符為製表符\t

alter table table_name set serdeprope

rties ('field.delim'='\t' , 'serialization.format'='\t');

alter語法修改分隔符只針對於後續新增資料有效,拿分割槽表而言,比如現在有2個分割槽,day=2020-05-01,day=2020-05-02,分隔符是\t, 通過alter把分隔符改為\001,再寫入寫的分割槽day=2020-05-03

可以通過desc formatted tablename partition(key=value)語法檢視每個分割槽的分隔符,那麼2020-05-01,2020-05-02的分割槽依然是\t分隔符,2020-05-03分割槽的分隔符是\001;而且可以通過hive正常讀寫操作這三個分割槽而不會出現任何問題

通過desc formatted table檢視該錶的分隔符,發現已經變為\001

1.建一張分割槽表,指定分隔符為\t

create table `tmp.test0506_sqoop`(            

`id` bigint,

`seq_no` string,

`name` string,

`e_type` string,

`status` string)

partitioned by (`day` string) row format delimited fields terminated by '\t'

lines terminated by '\n' stored as textfile;

2.通過sqoop導資料進來,指定分隔符為\t

sqoop import \

--mapreduce-job-name sqoop_table_*** \

--hive-drop-import-delims \

--connect "$" \

--username $ \

--password '$' \

--hive-overwrite \

--hive-import \

--split-by id \

--boundary-query 'select min(id),max(id) from ***' \

--hive-table tmp.test0506_sqoop \

--query 'select id,seq_no,name,e_type,status from *** where $conditions' \

--target-dir /tmp/sqoop_test0506_sqoop_`date +%s` \

--fields-terminated-by '\t' \

--hive-partition-key day \

--hive-partition-value '2020-05-01'

3.通過alter語法修改表的分隔符為\001

alter table tmp.test0506_sqoop set serdeproperties ('field.delim' = '\001' , 'serialization.format'='\001');
4.繼續用sqoop導資料,指定分隔符為\001

sqoop import \

--mapreduce-job-name sqoop_table_*** \

--hive-drop-import-delims \

--connect "$" \

--username $ \

--password '$' \

--hive-overwrite \

--hive-import \

--split-by id \

--boundary-query 'select min(id),max(id) from ***' \

--hive-table tmp.test0506_sqoop \

--query 'select id,seq_no,name,e_type,status from *** where $conditions' \

--target-dir /tmp/sqoop_test0506_sqoop_`date +%s` \

--fields-terminated-by '\001' \

--hive-partition-key day \

--hive-partition-value '2020-05-02'

5.檢視表,分割槽的分隔符

desc formatted tmp.test0506_sqoop;

| storage desc params:

| field.delim | \u0001

| line.delim | \n

| serialization.format | \u0001

desc formatted tmp.test0506_sqoop partition(day='2020-05-01');

| storage desc params:

| field.delim | \t

| line.delim | \n

| serialization.format | \t

desc formatted tmp.test0506_sqoop partition(day='2020-05-02');

| storage desc params:

| field.delim | \u0001

| line.delim | \n

| serialization.format | \u0001

6.檢視表資料,資料顯示正常

select * from tmp.test0506_sqoop where day='2020-05-01' limit 2;

select * from tmp.test0506_sqoop where day='2020-05-02' limit 2;

Hive的列分隔符和行分隔符

在建立hive表時,預設行分隔符 a 列分隔符 n 這兩項也是可以設定的。在實際開發中,一般預設使用預設的分隔符,當然有些場景下也會自定義分隔符。spark hive use test db 建立外部表 create external table test tb user id bigint com...

hive實現多分隔符

一 測試外表 create external 外表標識 table tmp.deli tmp 0117 z1 string,z2 string partitioned by pt string comment yyyymm row format serde org.apache.hadoop.hiv...

hive的列分隔符和行分隔符的使用

目錄 一 hive中預設的分割符如下 二 分隔符的指定與使用 三 建好表之後更改字段分隔符 分隔符描述 n 行分隔符 a欄位分隔符 001 barray struct的元素間的分隔符,map的鍵值對與鍵值對間分隔符 002 cmap中鍵與值之間的 分隔符 003 hive中在建立表時,一般會根據匯入...