hive建表指定列分隔符为多字符分隔符实战(默认只支持单字符)_hive row formate ###

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe’ WITH SERDEPROPERTIES (“field.delim”=“|#$”)


### 2、官方对列支持多个字符的分隔符调研


**参考****:**[MultiDelimitSerDe - Apache Hive - Apache Software Foundation]( )



> 
> **Introduction:**
> 
> 
> Introduced in [HIVE-5871]( ), MultiDelimitSerDe allows user to specify multiple-character string as the field delimiter when creating a table.
> 
> 
> 
> **Version:**
> 
> 
> Hive 0.14.0 and later.
> 
> 
> 
> **Hive SQL Syntax**:
> 
> 
> You can use MultiDelimitSerDe in a create table statement like this:
> 
> 
> 
> ```
> CREATE TABLE test (
>  id string,
>  hivearray array<binary>,
>  hivemap map<string,int>) 
> ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.MultiDelimitSerDe'                  
> WITH SERDEPROPERTIES ("field.delim"="[,]","collection.delim"=":","mapkey.delim"="@");
> ```
> 
> where field.delim is the field delimiter, collection.delim and mapkey.delim is the delimiter for collection items and key value pairs, respectively. 
> 
> 
> [HIVE-20619]( ) moved MultiDelimitSerDe to hive.serde2 in release 4.0.0, so user won't have to install hive-contrib JAR into the HiveServer2 auxiliary directory.
> 
> 
> 
> **Limitations:**
> 
> 
> * Among the delimiters, field.delim is mandatory and can be of multiple characters, while collection.delim and mapkey.delim is optional and only support single character.
> * Nested complex type is not supported, e.g. an Array<Array>.
> * To use MultiDelimitSerDe prior to Hive release 4.0.0, you have to add the hive-contrib jar to the class path, e.g. with the add jar command.
> 
> 
> 


### 3、小试牛刀,报错


建表时直接使用 


ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' WITH SERDEPROPERTIES ("field.delim"="|#$")


执行查询报错:Class org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe not found  
 根据网上的方案:进入hive执行(jar包路径根据自己环境路径对应修改)



add jar /usr/hdp/3.1.5.0-152/hive/lib/hive-contrib.jar

CREATE EXTERNAL TABLE table_tset(
id string,
name string,
year string)
PARTITIONED BY (
year string)
ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe’ WITH SERDEPROPERTIES (“field.delim”=“|#$”)
LOCATION
‘hdfs://CMBHHA/apps/hive/datahouse/test/table_tset’


### 4、几经搜索,问题终于解决,附上完整示例


#### 4.1、找到和hive版本对应的hive-contrib包,下载jar上传到hdfs上


[org/apache/hive/hive-contrib所有版本Jar文件及下载 -时代Java]( )


[hive-contrib包下载链接]( )


#### 4.2、以三个等号作为列分隔符 构建hive表的完整demo



add jar hdfs://team/work/libs/xxx/hive-contrib-2.0.1.jar;

drop table if exists mb_tmp.yz_1013;
create table if not exists mb_tmp.yz_1013(
test_id int,
work_place string,
other string
)
partitioned by(dt string)
ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe’ WITH SERDEPROPERTIES (“field.delim”=“===”)

load data local inpath ‘/data/home/xxxx/client/ct_data_1010.txt’ overwrite into table mb_tmp.yz_1013 partition(dt=‘2022-10-10’);


其中 以三个等号分割进行作为列分割的数据如下:



[work@xxxx client]$ cat ct_data_1010.txt
10011=beijing=chushi
10012
=tianjin=changchun
10013=zhengzhou=siji
100014
=zhangda=job


#### 4.3、结果验证



hive> desc mb_tmp.yz_1013;
OK
test_id int from deserializer
work_place string from deserializer
other string from deserializer
dt string

Partition Information

col_name data_type comment

dt string
Time taken: 0.332 seconds, Fetched: 9 row(s)

hive> set hive.cli.print.header=true;

hive> select * from mb_tmp.yz_1013 limit 100;
OK
yz_1013.test_id yz_1013.work_place yz_1013.other yz_1013.dt
10011 beijing chushi 2022-10-10
10012 tianjin chang
chun 2022-10-10
10013 zhengzhou siji 2022-10-10
100014 zhangda j
ob 2022-10-10
Time taken: 0.51 seconds, Fetched: 4 row(s)
hive> select other,‘****’,dt,work_place,test_id from mb_tmp.yz_1013 limit 100;
OK
other c1 dt work_place test_id
chushi **** 2022-10-10 beijing 10011
chang
chun **** 2022-10-10 tianjin 10012
siji **** 2022-10-10 zhengzhou 10013
j
ob **** 2022-10-10 zhangda 100014
Time taken: 0.356 seconds, Fetched: 4 row(s)


### **5、参考:**


**1)、Hive多字符分隔符支持**[https://baijiahao.baidu.com/s?id=1617938645018071295&wfr=spider&for=pc]( )


**2、Hive在0.14及以后版本支持字段的多分隔符,官方文档**https://cwiki.apache.org/confluence/display/Hive/MultiDelimitSerDe


**3、Hive中的自定义分隔符(包含Hadoop和Hive详细安装)**


 https://blog.csdn.net/github\_39577257/article/details/89020980


### 6、Hive 自带的多字符分割使用demo2


默认情况下,Hive对于分隔符只支持单字符,不过Hive自带一个工具jar包,这个包支持正则和多字符方式定义分隔符。


**1). 查询hive自带的工具jar包位置**  
 find / -name hive-contrib-\*.jar  
**2). 将上面搜索到的jar包配置到配置hive-site.xml文件中  
 <property>  
   <name>hive.aux.jars.path</name>  
   <value>file:///opt/apache-hive-1.2.2-bin/lib/hive-contrib-1.2.2.jar</value>  
   <description>Added by tiger.zeng on 20120202.These JAR file are available to all users for all jobs</description>  
 </property>**  
**上面配置之后可以不用重启Hive服务,只需要重新进入Hive CLI就可生效,且是永久的。也可以配置为临时的,就是在进入Hive CLI后,临时加载这个jar包,执行如下:**  
 hive> add jar file:///opt/apache-hive-1.2.2-bin/lib/hive-contrib-1.2.2.jar  
**3). 使用**  
 准备如下数据,分隔符为 |#|,



> 
> 3324|#|003|#|20190816 09:16:18|#|0.00|#|2017-11-13 12:00:00  
>  3330|#|009|#|20190817 15:21:03|#|1234.56|#|2017-11-14 12:01:00
> 
> 
> 


建表时如下声明与定义如下,并加载数据,查询数据:



> 
> drop table if exists split\_test;  
>  CREATE  TABLE  split\_test(  
>  id   INT COMMENT '借阅查询ID',  
>  number   STRING COMMENT '流水号',  
>  `date`   STRING COMMENT '查询返回日期',  
>  loanamount   DOUBLE COMMENT '借款金额范围',  
>  createtime   TIMESTAMP COMMENT '创建时间'  
>  )ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'  
>  WITH SERDEPROPERTIES ("field.delim"="|#|")  
>  STORED AS TEXTFILE;
> 
> 
> 


  
  --加载数据  
 LOAD DATA LOCAL INPATH '/root/split\_test.txt'  OVERWRITE INTO TABLE split\_test;  
    
 查询结果如下:  
 --查询数据  
 hive> select \* from split\_test;  
 OK  
 3324    003     20190816 09:16:18       0.0     2017-11-13 12:00:00  
 3330    009     20190817 15:21:03       1234.56 2017-11-14 12:01:00  
 Time taken: 0.11 seconds, Fetched: 2 row(s)  
  


### 7、Hive 自定义分隔符例子


  
**自定义部分使用 Java 编写,使用Idea新建一个 Maven项目。**  
 https://blog.csdn.net/github\_39577257/article/details/89020980


### **8、hive特殊分隔符,不可见的分隔符 枚举**



> 
> 1.hive默认字段分隔符**^A**(使用vim文本编辑显示),常用**ASCII八进制 '\001'** 或者**UNICODE编码十六进制 '\u0001'** 进行设置;通过notepad++打开显示为**SOH**
> 
> 
> 2.hive特殊分隔符**^B**(使用vim文本编辑显示),常用**ASCII八进制 '\002'** 或者**UNICODE编码十六进制 '\u0002'** 进行设置;通过notepad++打开显示为**STX**
> 
> 
> 3.hive特殊分隔符**^C**(使用vim文本编辑显示),常用**ASCII八进制 '\003'** 或者**UNICODE编码十六进制 '\u0003'** 进行设置;通过notepad++打开显示为**ETX**·
> 
> 
> 


此外,不同编程语音使用hive中\u0001、\0001、\0010、\u0010等分隔符切割需要不同写法



> 


![img](https://img-blog.csdnimg.cn/img_convert/09a976fc4f4c78c9ca39a261356b9ff2.png)
![img](https://img-blog.csdnimg.cn/img_convert/4901381b9b67bf1a174210e5fc0d9104.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

qWaJI-1715674755603)]
[外链图片转存中...(img-PSBJN7UR-1715674755603)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值