sqoop2 去除單引號與自定義分隔符
正在做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:絕