hive语法创建分区表,方便CDM做增量导出
数据湖里面建表,可以使用DataSource语法或Hive语法 ,两种建表语法创建的OBS表(即外表)在运行job时,在分区表下的文件夹路径会有所不同,DataSource语法创建的OBS分区表路径生成无规律,不利于CDM做数据的增量导出。
1. DataSource建表语法
create table if not exists database.table
(
begin_time string COMMENT '统计数据开始日期',
...
dt STRING COMMENT '分区时间') USING PARQUET options (
path 'obs://----------------/'
)PARTITIONED BY (dt)
;
如下图,在dt=20210401分区对应的数据,在OBS桶路径下dt分区的父目录 存在一串字符序列(由脚本运行时启动的job_id生成的)
2. Hive建表语法
create table if not exists database.table
)partitioned by (dt string comment '分区列')
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = ",", -- 分隔符
"quoteChar" = "\001", -- 包围符,根据CDM的包围符来配置
"escapeChar" = "\\" -- 转义字符
)
STORED AS TEXTFILE
LOCATION '------;
如果未指定,则使用默认的分隔符,包围符和转义符
DEFAULT_ESCAPE_CHARACTER \
DEFAULT_QUOTE_CHARACTER "
DEFAULT_SEPARATOR ,
使用Hive的建表语法创建的分区表,在OBS桶路径下dt分区的父目录不会生成一串字符序列
CDM做增量导出时,可以使用变量指定路径,path/dt=${dateformat(yyyyMMdd)},由于DataSource创建OBS分区表会导致分区的路径无规律可循,
无法做数据的增量导出,所以推荐ads层可以使用hive建表语法,方便做增量导出。
此 SerDe 适用于大多数 CSV 数据,但不处理嵌入式换行符, \t
或 \n
无法直接转义。要对它们进行转义,请使用 "escapeChar" = "\\"
。。要使用 SerDe,请指定完全限定的类名称 org.apache.hadoop.hive.serde2.OpenCSVSerde。
文档基于原始文档https://github.com/ogrodnek/csv-serde。
查询时可能出现的报错
DLI.0999: SerDeException: com.opencsv.exceptions.CsvMalformedLineException: Unterminated quoted field at end of CSV line. Beginning of lost text: [Problem solved rapidly
]
在上图的数据源文件,可以看到字段中的内容多了 换行符,导致文本切割出现问题。此报错对于CDM 导出无影响,对于数据湖中的查询可能报错,文件扫描到该行会报错
原因:字段中的换行符导致csv文本切割出现问题,无法查询
解决方法: 1. 查询报错,在允许字段内容部分失真的情况下,可替换字段中的换行符;
2. 用Parquet格式创建临时表,重跑需要查询的数据
3. 在CDM导出的数据库中查询
regexp_replace(brief_description , '\n|\r|\r\n', ' ') as brief_description
CDM作业配置注意事项
ads层采用Hive语法创建的csv表,存储的文件不带标题行,在CDM配置时“首行为标题行”选项选择“否”,创建的ads表使用的包围符quoteChar注意与CDM的包围符保持一致。
- 点赞
- 收藏
- 关注作者
评论(0)