2017-10-10 50 views
0

刪除^ A和\ n我得到一個臨時table.I的數據是從臨時表中選擇所有列的數據,並插入到基座table.After插入到基表文件看起來像下面。如何從文件中使用蜂巢

val1^Aval2^Aval3^A\N^Aval4^A\N 但我需要的數據是這樣的。

val1 val2 val3 val4 

^必須從文件中刪除,\ N應該用空格替換。 我想在蜂巢中實現這一點,任何幫助都很感激。

回答

1

蜂房的輸出使用字段分隔符寫入,通過默認配置單元使用CTRL-A分隔符,即(^A)。所以在這裏你可以看到輸出文件中間有^ A個字符。默認情況下,NULL值被寫入在數據文件中的數據文件作爲\ N和\ n

查詢數據時被解釋爲NULL。

所以,如果你不想在輸出數據文件\ -N,您可以使用蜂巢COALESCE功能這些數據類型設置的默認值。 COALESCE函數返回值,如果它不爲空,並且它爲空,則返回指定的默認值。

方法1: 創建一個帶有字段分隔符'\ t'(即選項卡)的基表。在create table語句中覆蓋屬性'serialization.null.format'=''以設置空字符串的默認值而不是\ N。

CREATE TABLE base_table (
column_1 BIGINT, 
column_2 STRING 
) ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE 
LOCATION '/tmp/base_table' 
TBLPROPERTIES('serialization.null.format'=''); 

然後,在使用以下查詢表插入數據:

INSERT OVERWRITE TABLE base_table 
SELECT COALESCE(column_1, 0L), COALESCE(column_2,"") 
FROM my_table 
[ some WHERE clause here] 

你將看到的輸出文件將與標籤分離和\ N個值將被設置爲字段類型默認。

方法2:

第一種方法將是優選的。在這種方法中使用基表上插入覆蓋目錄和輸出寫入到目錄想:

INSERT OVERWRITE LOCAL DIRECTORY '/home/user/my_table_output/' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' ESCAPED BY '"' LINES TERMINATED BY '\n' 
STORED AS TEXTFILE 
SELECT COALESCE(column_1, 0L), COALESCE(column_2,"") 
FROM base_table; 

在輸出目錄,你會看到預期的格式輸出。

方法3:

從你的解釋,它看起來像你正試圖讀取該輸出文件和我假設你是通過MapReduce的代碼,閱讀它。

您可以使用分隔符'\ u0001'(編碼時使用轉義字符,即'\ u0001')來分割輸入字符串。

在處理每行/字段時,您可以檢查'\ N'字符串的出現並將其替換爲任何默認值。

+0

感謝Abhijeet的幫助。方法1的工作原理是^ A是關注的,但是\ N仍然存在於文件中。 – user1734980

+0

您是否嘗試過在領域使用COALESCE? –

+0

我已經更新了方法1創建表語句,重寫表屬性'serialization.null.format'='',它將解決您的問題。 –

0

您可以使用regexp_replace這一點。例如,爲了取代您^ A:

regexp_replace(<your column>,'\\^A',' ') 
+0

此功能不起作用。即使我看到相同的文件。 – user1734980

0

爲\ n

replace(column_name, "\\\N", " ") 

對於^ A

replace(column_name, "\\^A", "")