设置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的值可替换为自定义的分割符。

相关文章
相关标签/搜索