刪除^ A和\ n我得到一個臨時table.I的數據是從臨時表中選擇所有列的數據,並插入到基座table.After插入到基表文件看起來像下面。如何從文件中使用蜂巢
val1^Aval2^Aval3^A\N^Aval4^A\N
但我需要的數據是這樣的。
val1 val2 val3 val4
^必須從文件中刪除,\ N應該用空格替換。 我想在蜂巢中實現這一點,任何幫助都很感激。
刪除^ A和\ n我得到一個臨時table.I的數據是從臨時表中選擇所有列的數據,並插入到基座table.After插入到基表文件看起來像下面。如何從文件中使用蜂巢
val1^Aval2^Aval3^A\N^Aval4^A\N
但我需要的數據是這樣的。
val1 val2 val3 val4
^必須從文件中刪除,\ N應該用空格替換。 我想在蜂巢中實現這一點,任何幫助都很感激。
蜂房的輸出使用字段分隔符寫入,通過默認配置單元使用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'字符串的出現並將其替換爲任何默認值。
您可以使用regexp_replace這一點。例如,爲了取代您^ A:
regexp_replace(<your column>,'\\^A',' ')
此功能不起作用。即使我看到相同的文件。 – user1734980
爲\ n
replace(column_name, "\\\N", " ")
對於^ A
replace(column_name, "\\^A", "")
感謝Abhijeet的幫助。方法1的工作原理是^ A是關注的,但是\ N仍然存在於文件中。 – user1734980
您是否嘗試過在領域使用COALESCE? –
我已經更新了方法1創建表語句,重寫表屬性'serialization.null.format'='',它將解決您的問題。 –