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
ads層采用Hive語法創建的csv表,存儲的文件不帶標題行,在CDM配置時“首行為標題行”選項選擇“否”,創建的ads表使用的包圍符quoteChar注意與CDM的包圍符保持一致。
Hive spark 云數據遷移 CDM 數據湖探索 DLI
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。