Hive的知识

Hive 的编译

Hive用Java开发的,编译可以通过Maven来编译。 编译过程如下:

    mvn clean package -Pdist -DskipTests
    
    这里的dist是Profile的名字。如果从apache下载的hive,那么这么写问题不大。如果是从cloudera下载的源码,就要写成-Phadoop-2。

    
    如果是在没有外网的情况下编译,则需要建有内部repo。
    如果要使用内部repo,则需要修改.m2/settings.xml文件。
    <mirrors>
        <mirror>
            <mirrorOf>*</mirrorOf>
            <name>central-mirror</name>
                <url>http://10.129.40.91:8081/artifactory/all</url>
                <id>central-cache</id>
        </mirror>
    </mirrors>

编译结束之后要做几件事:

  1. 创建hive-site.xml,只要保证以下和metastore相关的元素在,hive就能正常工作 。

     <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
     <configuration>
         <property>
         <name>javax.jdo.option.ConnectionDriverName</name>
         <value>org.apache.derby.jdbc.EmbeddedDriver</value>
         <description>Driver class name for a JDBC metastore</description>
         </property>
         <property>
         <name>javax.jdo.option.ConnectionURL</name>
         <value>jdbc:derby:;databaseName=metastore_db;create=true</value>
         <description/>
         </property>
         <property>
         <name>javax.jdo.option.ConnectionUserName</name>
         <value>APP</value>
         <description>Username to use against metastore database</description>
         </property>
         <property>
         <name>javax.jdo.option.ConnectionPassword</name>
         <value>mine</value>
         <description>password to use against metastore database</description>
         </property>
         <property>
         <name>hive.exec.compress.output</name>
         <value>false</value>
         <description/>
         </property>
     </configuration> 
    

    对应的hadoop core-site.xml也要做相应的调整,否则无法使用hadoop用户去访问数据。

     <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
     <configuration>    
         <property>
         <name>hadoop.proxyuser.hadoop.groups</name>
         <value>hadoop</value>
         <description>Allow the superuser oozie to impersonate any members of the group group1 and group2</description>
         </property>
         <property>
         <name>hadoop.proxyuser.hadoop.hosts</name>
         <value>*</value>
         <description>The superuser can connect only from host1 and host2 to impersonate a user</description>
         </property>
    
  2. 接下来要初始化metastore。用schematool就可以,就是创建一些表。指定数据库类型,和操作类型 。

  3. 最后就是启动hadoop服务,让hive能够读写hdfs

和终端有关的一些问题

在测试验证hive对中文表名支持的过程中,遇到一个问题,就是通过终端输入的中文,不是utf-8编码。这个问题通常是使用 locale来解决 ,但是具体如何使用,还是有点技巧的 。

#首先查看有哪些locale
$ locale -a
C
en_AG
en_AG.utf8
...
POSIX

#如果你需要的不在列表中例如 ,zh_CN.UTF-8,那么就要生成它 。

$sudo locale-gen zh_CN.UTF-8

Generating locales...
  zh_CN.UTF-8... done
Generation complete.
The following file contains a list of all available locales: /usr/share/i18n/SUPPORTED 

#还可以将你需要的locale设为默认值
#方法一: 修改/etc/default/locale 
$ cat /etc/default/locale 
LANG=zh_CN.UTF-8
#方法二:运行下列命令
# update-locale LANG=zh_CN.UTF-8

全部设置好之后,通过putty连上。Putty这端,注意采用utf-8字符集去连接即可。

如何让Hive支持中文表名?

对于Hive而言,目前仅支持英文表名,但是这并不代表它不能够使用中文表名,从开发的角度来说,中文和英文,并没有本质上的区别。

对于Hive SQL来说,表名,字段名统一称为Identifier,而Identifier到底能不能用英文名,只是一个习惯问题,而不是一个技术问题。

基于以上背景,实际上就应该知道,让Hive SQL支持中文表名,字段名,并不是什么大不了的事情。

跟踪Hive执行SQL代码的流程,能够比较清楚的看到,首先Hive会在CreateTable环节,检查表名是否规范。如果不规范,就直接拒绝了。

其次,就算通过了建表,在执行sql代码前,还有一个词法和语法分析的环节。在这里,Hive仍然会检查中文的表名、字段名是否符合词法分析的的规则。

把这两个环节打通,那么中文表名、字段名、视图名就不在话下了。

#file: metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java
#修改 validateName函数
    //String allowedCharacters = "\\w_";
    String allowedCharacters = "\\x{4e00}-\\x{9fa5}\\w_";

#file: ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g
#增加这么一段
// LITERALS
fragment
CNChar
    :'\u4E00'..'\u9FA5' | '\uF900'..'\uFA2D'
    ;

重新编译,打包。然后将打包好的lib文件中的hive*.jar覆盖原来的jar,就完成了对中文表名、视图名、字段名的支持。就这么简单。

如果觉得我的文章对您有帮助,欢迎打赏!

收钱码

转载于:https://my.oschina.net/pearma/blog/1795545

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值