1. 程式人生 > >sqoop2 去除單引號與自定義分隔符

sqoop2 去除單引號與自定義分隔符

1、緣由(需求)

      正在做oracle到hive的資料匯入,遇到資料分隔問題,sqoop2 預設分隔式逗號,我使用hive 也是逗號分隔,發現數據中含有逗號的欄位,hive把它分成了好幾個。於是去網上找自定義分隔的解決方法,但是無奈這方面的資料很少。不解決此問題,工作無法進行。勝了最後一個法寶,編譯原始碼。

2、去下載跟你使用的一個版本的sqoop2 原始碼(最好),使用maven構建,(注意,打包時最好跳過test,進行編譯,不然可能會報錯)

3、修改程式碼:

       定位:應為是寫到hdfs上,所謂我認識應該寫該hdfs-connector的程式碼,發現程式碼中有定義預設分隔符的,把它改成 製表符,編譯->上傳後,發現結果沒有改變。接著思考,發現類:org.apache.sqoop.connector.hdfs.hdfsWriter.HdfsTextWriter下有個write方法,並且有個HdfsConstants.DEFAULT_RECORD_DELIMITER(每行的記錄的預設分隔),

這個是每個記錄以逗號分隔的的資料,現在要寫個方法將其分開(把單引號作為一種標誌把,欄位的逗號跟非分隔符逗號分開)

4、下面是以逗號分隔改為以 ‘\t’分隔的程式碼(org.apache.sqoop.connector.hdfs.hdfsWriter.HdfsTextWriter整個類)

package org.apache.sqoop.connector.hdfs.hdfsWriter;

import com.google.common.base.Charsets;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.sqoop.connector.hdfs.HdfsConstants;

import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class HdfsTextWriter extends GenericHdfsWriter {

  private BufferedWriter filewriter;

  @Override
  public void initialize(Path filepath, Configuration conf, CompressionCodec codec) throws IOException {
    FileSystem fs = filepath.getFileSystem(conf);

    DataOutputStream filestream = fs.create(filepath, false);
    if (codec != null) {
      filewriter = new BufferedWriter(new OutputStreamWriter(
              codec.createOutputStream(filestream, codec.createCompressor()),
              Charsets.UTF_8));
    } else {
      filewriter = new BufferedWriter(new OutputStreamWriter(
              filestream, Charsets.UTF_8));
    }
  }

  @Override
  public void write(String csv) throws IOException {
    filewriter.write(transfer(csv) + HdfsConstants.DEFAULT_RECORD_DELIMITER);

  }

  @Override
  public void destroy() throws IOException {
    filewriter.close();
  }
  private String transfer(String csv){
		String words[]=csv.split(",");
		StringBuffer sb=new StringBuffer();
		boolean flag1=false;
		boolean flag2=false;
		boolean flag3=false;
		String temp="";
		for (int i = 0; i < words.length; i++) {
			if(words[i].equalsIgnoreCase("NULL")){
				words[i]="-1";
			}
			flag1=words[i].startsWith("'");
			flag2=words[i].endsWith("'");
			if(flag1&&flag2){
				sb.append(words[i]);
				sb.append('\t');
			}else if(flag1&&!flag2){
				temp=words[i]+",";
				flag3=true;
			}else if(!flag1&&flag2){
				temp=temp+","+words[i];
				flag3=false;			
				sb.append(temp);
				sb.append('\t');
			}else{
				if(flag3){
					temp=temp+words[i];
				}else{
					sb.append(words[i]);
					sb.append('\t');
				}
			}
		}
		return sb.toString().replace("'", "").trim();
		//return sb.toString().trim();
	}

}

5、打包,及上傳到sqoop2資料夾/webapps/sqoop/WEB-INF/lib(或許由於版本不一樣而有差別,請選擇connector所在的資料夾),在上傳之前要把hdfs-connector,mv 到其他資料夾(為了保險),也可以刪掉(不建議),也可以把hdfs-connector裡的名字改掉(未試驗),重啟sqoop2。執行任務看看效果。

6、完成。

相關推薦

sqoop2 去除引號定義分隔符

1、緣由(需求)       正在做oracle到hive的資料匯入,遇到資料分隔問題,sqoop2 預設分隔式逗號,我使用hive 也是逗號分隔,發現數據中含有逗號的欄位,hive把它分成了好幾個。於是去網上找自定義分隔的解決方法,但是無奈這方面的資料很少。不解決此問

python/Djangof分頁定義分頁

from r+ else active count() 返回 log 多少 pan python/Djangof分頁與自定義分頁 Django分頁 1 ##============================================分頁========

給文件夾右鍵菜添加定義程序並打開此文件夾

tro 打開 class .exe 路徑 clas code 準備 初級 win+r 打開運行程序,輸入regedit打開註冊表編輯器 先備份當前註冊表 然後找到 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell 目錄

thinkphp 條件查詢 模糊查詢 區間查詢 in 查詢 定義查詢

thinkphp eq => ‘=‘ $map[‘id‘]= array(‘eq‘,‘2‘); neq => ‘<>‘ $map[‘id‘]=array(‘neq‘,2); gt => ‘>‘ $map[‘id‘]=array(‘gt‘,3); egt => ‘>

註銷憑證定義屏幕

endif 添加 har pan ogr pen exce date per 註意註銷憑證FB03 (事務代碼SHDB) 自定義屏幕的功能代碼與標準程序要對應一致 SPAN { font-family: "Courier New"; font-size: 10pt;

存儲過程定義函數的區別

.cn logs -1 定義 img ima 自定義 image cnblogs 存儲過程與自定義函數的區別

異常類方法定義異常

異常類方法 自定義異常 異常類方法: 構造器:Throwble(String) 傳進錯誤消息 Message getMessage(); 得到錯誤消息printStackTrace(); 打印錯誤堆棧信息 printStackTrace(PrintStream); 指定打印方向(System.o

MySQL存儲過程/存儲過程定義函數的區別

toolbar 基本 value reg pan lba tin 進行 只為 ---------------------------存儲過程-------------------- 語法: 創建存儲過程: CREATE [definer = {user|current

PHP之文件引用定義函數

urn global sta include 賦值 傳遞 語法 功能實現 頁面 PHP文件間的引用 include語言結構 格式:mixed include(string resource); 將一個資源文件resource載入到當前PHP程序中; resource資

Vue2.0筆記——{{}}模板定義過濾器

Vue模板語法 讓我們回到最開始 <div id="app"> <h1>{{message}}</h1> </div> <script> var vm = new Vue({ el:‘#app‘

Java基礎-類加載機制定義類Java類加載器(ClassLoader)

定義類 方式 blog 之前 www 筆記 通過 反射 加載機制          Java基礎-類加載機制與自定義類Java類加載器(ClassLoader)                                     作者:尹正傑 版權聲明:原創作品,謝絕轉

Android中的Drawable基礎菠菜bc平臺搭建架設定義Drawable

eat 動效 之間 搭建 androi enc view tint 1.0 1、Drawable是什麽? 一種可以在Canvas上進行繪制的抽象的概念顏色、圖片等都可以是一個DrawableDrawable可以通過XML定義,或者通過代碼創建Android中Drawable

Excel定義顏色美化單元格顏色配置技巧定義顏色主題

ref 行修改 col ffffff 字體 自定義 技術分享 course 常見問題 用戶可以在內置主題的基礎上,對主題的顏色和字體等進行修改,然後保存為新的主題,以方便在其它工作簿中使用!(常見問題)Excel按條件填充顏色顏色配置技巧與自定義顏色主題 【解決方法,教程視

Mysql中儲存過程定義函式的區別

建立儲存過程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) [ characteristi

Hadoop的combiner學習定義combiner

Combiner的概念 Combiner號稱本地的Reduce,Reduce的輸入是Combiner的最終輸出。 在MapReduce中,當map生成的資料過大時,頻寬就成了瓶頸,怎樣精簡壓縮傳給Reduce的資料,有不影響最終的結果呢。有一種方法就是使用Combiner,Comb

MFC 文件定義exe程式左上角圖示

我使用的是vs2012。 1、首先新建一個單文件工程 2、開啟MainFrm.cpp,在OnCreat()函式中return 0;之前新增下列語句:   TCHAR path[100];   GetCurrentDirectory(255,pa

微信小程式選框定義賦值

這裡我們應用之前一篇寫過的彈框效果 , 哈哈哈 ,是不是很萬精油;單選框我們運用偽元素自定義,不使用圖片 , 這個例子可以運用到很多情況; 知識點: 1、理解wx:if作用 2、理解三元運算子的使用 3、利用偽元素after/before自定義內容 4、定時器setTimeout的使用 照例

MapReduce常見演算法 定義排序及Hadoop序列化

MapReduce常見演算法 •單詞計數 •資料去重 •排序 •Top K •選擇  以求最值為例,從100萬資料中選出一行最小值 •投影  以求處理手機上網日誌為例,從其11個欄位選出了五個欄位(列)來顯示我們的手機上網流量 •分組  相當於分割槽,以求處理手機上網日誌為例,喊手機號和非手

自動為瀏覽器中複製出來的表資料加上引號冒號

做爬蟲的朋友,這個很麻煩。 首先啊,全選將資料複製到editplus,或其它的編輯器中,這裡用editplus,然後,兩個(.*?)之間的是鍵值的分隔符: ^(.*?)    (.*?)$ '$1':'$2' 正則的規則,不懂的可以問我。 kouk

Python之過濾器定義

1.首先定義一個User類新增屬性設定魔術方法並且例項化 接著設定本地路由 本地路由有兩個自定義函式 新增 /index3/路由 下面兩張圖是index2.html頁面內容 其中,capitalize是標題的意思;reverse則是全部反轉 round:四捨五入 ; abs:絕