設置beeline鏈接hive的數據展現格式

  問題描述:beeline -u 方式導出數據,結果文件中含有「|」(豎槓)。sql

  執行的sql爲:beeline -u jdbc:hive2://hadoop1:10000/default -e 'select * from tablename' > /home/tmp/result.nbapache

  執行結果以下:oop

  在Beeline中,結果能夠被展現爲多種格式,格式能夠在outputformat參數中設置。下面是支持的輸出各式:spa

  其中tableverticalxmlattrxmlelements是按照特有的形式展現結果,好比verticalkey-value格式展現,xmlelementsxml格式展現。詳情見:3d

https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clientsorm

        separated-value formats展現形式是將一行值按照不一樣分割符分開,主要包括五種分割輸出格式:csv, tsv, csv2, tsv2, dsv,目前csvtsv已經被csv2tsv2替代了。dsvcsv2tsv2是從 Hive 0.14 開始引入的SV輸出格式,csv2使用的是逗號,tsv2使用的是tab空格,dsv是可配置的。對於dsv格式,分隔符能夠經過用參數 delimiterForDSV 進行設置,默認是 '|'xml

  對於問題描述可知beeline輸出結果中字段之間使用「|」分割的,從前面分析可知, csv2和tsv2格式字段值分割符不多是|」,只有輸出爲dsv格式,分割符能夠設置,且默認分割符是|」。但是在執行beeline時並未設置outputformatdelimiterForDSV 參數的值,說明使用的是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的值可替換爲自定義的分割符。

相關文章
相關標籤/搜索