1. 程式人生 > >Sqoop之匯入到Hive時特殊字元導致資料變亂

Sqoop之匯入到Hive時特殊字元導致資料變亂

    問題是這樣的:

    Sqoop從關係型資料庫匯入資料到Hive時,發現數據量增多了,查詢之後發現是由於源資料中含義\r\t\n特殊字元的資料,這樣Hive遇到之後就將其視為換行,所以匯入到Hive後資料條數增多了很多,問題找到了,怎麼解決呢.

方法1: sqoop的sql中對含有特殊字元的欄位進行replace操作,如下List-1所示,將特殊字元轉換為空格。

    List-1 從mysql匯入時用replace

replace(replace(replace(description,'\r',' '),'\n',' '),'\t',' ')

方法2: 使用hive-drop-import-delims,這是sqoop官方提供的一個引數,匯入到hive時,遇到特殊字元就會將改字元丟棄,如下List-2

    List-2

sqoop import \
--connect jdbc:mysql://xxxxxxx \
--username xxx --password xxx \
--delete-target-dir \
--target-dir /tmp/hive/xxxx_temp \
-m 1 \
--query "SQL查詢語句 where \$CONDITIONS" \
--hive-drop-import-delims \
--split-by xxx \
--fields-terminated-by "\t" \
--lines-terminated-by "\n"

    Sqoop還提供了另一個引數--hive-delims-replacement,它會將特殊字元替換為我們設定的字元。

 

                                                                               圖1

    如上圖1是官網的截圖。由於歷史原因,目前我們倆種方式都使用,但是都慢慢的改為方法2了。

Reference

  1. http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html