hive语法创建分区表,方便CDM做增量导出

网友投稿 1117 2022-05-30

背景:

数据湖里面建表,可以使用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" = "

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 '------;

1", -- 包围符,根据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。

hive语法创建分区表,方便CDM做增量导出

文档基于原始文档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

ads层采用Hive语法创建的csv表,存储的文件不带标题行,在CDM配置时“首行为标题行”选项选择“否”,创建的ads表使用的包围符quoteChar注意与CDM的包围符保持一致。

Hive spark 云数据迁移 CDM 数据湖探索 DLI

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:CAS 5.3.1系列之自定义JDBC认证策略(三)
下一篇:web前端必备的VSCode插件
相关文章