問題描述:beeline -u 方式導出數據,結果文件中含有「|」(豎槓)。sql
執行的sql爲:beeline -u jdbc:hive2://hadoop1:10000/default -e 'select * from tablename' > /home/tmp/result.nbapache
執行結果以下:oop
在Beeline中,結果能夠被展現爲多種格式,格式能夠在outputformat參數中設置。下面是支持的輸出各式:spa
其中table、vertical、xmlattr和xmlelements是按照特有的形式展現結果,好比vertical以key-value格式展現,xmlelements以xml格式展現。詳情見:3d
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clientsorm
separated-value formats展現形式是將一行值按照不一樣分割符分開,主要包括五種分割輸出格式:csv, tsv, csv2, tsv2, dsv,目前csv和tsv已經被csv2和tsv2替代了。dsv,csv2和tsv2是從 Hive 0.14 開始引入的SV輸出格式,csv2使用的是逗號,tsv2使用的是tab空格,dsv是可配置的。對於dsv格式,分隔符能夠經過用參數 delimiterForDSV 進行設置,默認是 '|'。xml
對於問題描述可知beeline輸出結果中字段之間使用「|」分割的,從前面分析可知, csv2和tsv2格式字段值分割符不多是「|」,只有輸出爲dsv格式,分割符能夠設置,且默認分割符是「|」。但是在執行beeline時並未設置outputformat和delimiterForDSV 參數的值,說明使用的是Beeline默認的輸出格式,從outputformat說明中得知Beeline默認的輸出各式爲table模式,因此接下來就須要弄清楚table模式下字段分隔符是否爲「|」。blog
首先在BeeLine類中找到展現結果相關的代碼,以下圖所示:hadoop
從上圖可知,beeline使用的輸出格式是經過getOutputFormat()方法獲取的,那就進入該方法看看,以下圖所示:element
能夠看出getOutputFormat()方法直接將outputFormat值返回,接下來就須要看看outputFormat的值從哪來的,經過搜索得知除了outputFormat的默認值外,只有上圖中setOutputFormat(String outputFormat)會給outputFormat設置值,但是setOutputFormat(String outputFormat)只有在beeline執行語句中設置outputformat纔會被調用,而事實並未在beeline中設置outputformat,因此getOutputFormat()獲取的是outputformat默認值,outputformat的默認值爲"table",相關代碼以下:
TableOutputFormat類的print()方法實現邏輯以下:
從上圖可知,在print()方法中主要是設置表格中表頭、表體、表中值的展現格式,這裏只關注表中字段值的分割符,所以繼續進入圖中第85行代碼看看對值的格式處理,代碼以下:
此處要看的是table默認下對值是怎麼分割的,故header的值爲false,因此會走該段代碼的else邏輯,顯然從圖中紅框中的代碼可知值之間使用「|」分割的。
通過以上分析可知,若是沒有在beeline執行語句中設置outputformat參數,默認展現格式會使用table模式,而table模式下字段值之間的分割符爲「|」,所以咱們看到beeline展現的結果是以「|」分割的。若是不想使用「|」做爲分割符,能夠經過如下方式來設置:
方式一:若是值之間用逗號分割,能夠在beeline執行語句中加入--outputformat=csv2;若是值之間用tab分割,能夠在beeline執行語句中加入--outputformat=tsv2。
(1)將beeline的輸出格式設置爲csv2,即以逗號做爲值之間的分割符。
SQL示例以下:
beeline -u jdbc:hive2://hadoop1:10000/default --outputformat=csv2 -e 'select * from tablename' > /home/tmp/result.nb
展現結果以下:
(2)將beeline的輸出格式設置爲tsv2,即以tab做爲值之間的分割符
SQL示例以下:
beeline -u jdbc:hive2://hadoop1:10000/default --outputformat=tsv2 -e 'select * from tablename' > /home/tmp/result.nb
展現結果以下:
方式二:若是方式的分割符不知足需求,想經過其餘分割符來分割beeline的執行結果值,能夠在beeline執行語句中加入--outputformat=dsv2和--delimiterForDSV=DELIMITER。
(1)將beeline的輸出格式設置爲dsv2,使用dsv2默認的分割符,即‘|’。
SQL示例以下:
beeline -u jdbc:hive2://hadoop1:10000/default --outputformat=dsv -e 'select * from tablename' > /home/tmp/result.nb
結果展現以下:
(2)將beeline的輸出格式設置爲dsv2,並以tab做爲值之間得分割符
SQL示例以下:
beeline -u jdbc:hive2://hadoop1:10000/default --outputformat=dsv --delimiterForDSV=$'\t' -e 'select * from tablename' > /home/tmp/result.nb
結果展現以下:
(3)將beeline的輸出格式設置爲dsv2,並以#做爲值之間得分割符
SQL示例以下:
beeline -u jdbc:hive2://hadoop1:10000/default --outputformat=dsv --delimiterForDSV=# -e 'select * from tablename' > /home/tmp/result.nb
結果展現以下:
備註:若是使用dsv2輸出格式,值之間的分割符使用默認值,在beeline執行語句中只須要加入--outputformat=dsv就能夠;若是使用dsv2輸出格式,想經過自定義分割符來對值進行分割,不只要在beeline執行語句中只須要加入--outputformat=dsv,還須要加入--delimiterForDSV=DELIMITER,實際使用時DELIMITER的值可替換爲自定義的分割符。