Hive的列分隔符和行分隔符

在创建Hive表时,默认行分隔符"^A",列分隔符"\n",这两项也是可以设置的。在实际开发中,一般默认使用默认的分隔符,当然有些场景下也会自定义分隔符。

创建表1:

spark-hive
use test_db;

# 创建外部表
CREATE EXTERNAL TABLE test_tb (
user_id bigint COMMENT '用户ID',
user_name string COMMENT '用户名'
)
LOCATION '/home/test_db/test_tb'
;

查看表1:

show create table test_tb;
20/04/13 11:47:49 INFO SparkHiveShell: current SQL: show create table test_tb
CREATE EXTERNAL TABLE `test_tb`(
  `user_id` bigint COMMENT '用户ID',
  `user_name` string COMMENT '用户名')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'  # 默认分隔符,行分割符:"\n",列分割符:"^A"
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat'  # 默认存储格式textfile
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' # HDFS存储目录
LOCATION
  'hdfs://namenode.xxx.com:9000/home/test_db/test_tb'
TBLPROPERTIES (
  'transient_lastDdlTime'='1586749208')
Time taken: 1.702 s

创建表2:

CREATE EXTERNAL TABLE test_tb_2 (
user_id bigint COMMENT '用户ID',
user_name string COMMENT '用户名'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n' 
LOCATION '/home/test_db/test_tb_2'
;

查看表2:

show create table test_tb_2;
20/04/13 11:55:22 INFO SparkHiveShell: current SQL: show create table test_tb_2
CREATE EXTERNAL TABLE `test_tb_2`(
  `user_id` bigint COMMENT '用户ID', 
  `user_name` string COMMENT '用户名')
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\t' # 列分割符,表2的列分割符为:"\t"
  LINES TERMINATED BY '\n'  # 行分割符,表2的行分隔符为:"\n"
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://namenode.xxx.com:9000/home/test_db/test_tb_2'
TBLPROPERTIES (
  'transient_lastDdlTime'='1586749805')
Time taken: 2.485 s

从如上两个例子中可以看出:Hive默认的列分隔符类型为“org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe”。

Hive中默认的列分割符为:"^A"(CTRL+V,CTRL+A),在数据文件中为:"1^AJom\n",如果需要自定义分隔符,需要设置 "ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'",因为^A八进制编码为“\001”,如果使用默认的分隔符,可以不加此参数。

Hive中默认行分隔符为"\n",也可以通过"LINES TERMINATED BY '\n' "来设置。

一般来说Hive默认行分隔符为换行符,如果非要自定义分隔符,可以通过定义INPUTFORMAT和OUTPUTFORMAT类来指定特定的(行|列)分隔符。

提示

使用时需要注意:数据中如果包含:"\001","\n"等分隔符,需要提前处理掉。正常在HQL中我们需要REGEXP_REPLACE(字段,'\r|\n|\r\n|\001|\002|\003|\t', '')把常用的分隔符转移掉,免得带来串列,断行的困扰。

发布了160 篇原创文章 · 获赞 21 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/guichenglin/article/details/105485743