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

举报
roger_0936 发表于 2022/03/28 19:09:15 2022/03/28
【摘要】 背景:数据湖里面建表,可以使用DataSource语法或Hive语法 ,两种建表语法创建的OBS表(即外表)在运行job时,在分区表下的文件夹路径会有所不同,DataSource语法创建的OBS分区表路径生成无规律,不利于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的包围符保持一致。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。