在创建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', '')把常用的分隔符转移掉,免得带来串列,断行的困扰。