假設我想在 Hive 中創建一個包含 4 列的簡單表,并加載一些以管道開頭的管道分隔資料。
CREATE table TEST_1 (
COL1 string,
COL2 string,
COL3 string,
COL4 string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|';
原始資料:
|123|456|Dasani Bottled|5|,
|124|455|Test Bottled |7|
表獲取日期
----------------------------------
COL1 COL2 COL3 COL4
----------------------------------
123 456 Dasani Bottled
123 455 Test Bottled
----------------------------------
COL1 變空且最后一列未加載。我嘗試使用 Hadoop put 命令加載 csv 檔案。
幫我解決這個問題。
uj5u.com熱心網友回復:
如果無法修復資料檔案,您可以使用 RegexSerDe 而不是 LasySimpleSerDe(文本檔案的默認 SerDe)。
定義您的資料在正則運算式中的外觀。每列在正則運算式中都應該有相應的捕獲組 ()。
要在創建表之前測驗正則運算式的作業方式,請使用 regex_replace
select regexp_replace('|123|456|Dasani Bottled|5|, ', --your row example
'^\\|(.*?)\\|(.*?)\\|(.*?)\\|(.*?)\\|.*', --4 groups are in the regex
'$1 $2 $3 $4'); --output space delimited fields
結果:
123 456 Dasani Bottled 5
如果正則運算式按預期作業,請創建表(不一定是外部的):
create external table TEST_1 (
COL1 string,
COL2 string,
COL3 string,
COL4 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES ('input.regex'='^\\|(.*?)\\|(.*?)\\|(.*?)\\|(.*?)\\|.*')
location ....
;
然后將檔案復制到表位置或使用 LOAD 命令。
uj5u.com熱心網友回復:
你可以通過兩種方式解決這個問題。
- 在處理檔案之前洗掉第一列。這是干凈且優選的解決方案。
cut -d "|" -f 2- input_filename > output_filename
然后使用這個 output_filename 作為加載程序的輸入。
-d "|"- 這就是說,使用管道作為分隔符。
-f 2- - 這就是說,在第一個欄位之后提取所有內容。
- 像這樣在表的開頭添加一個虛擬列
CREATE table TEST_1 (
dummy string,
COL1 string,
COL2 string,
COL3 string,
COL4 string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|';
然后繼續加載資料。然后您可以忽略此虛擬列或將資料存盤到沒有此列的最終表中,或在此之上創建一個視圖以排除此虛擬列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424058.html
