hive -e 和hive -f 的注意点 (//和////)

本文介绍了在使用Hive SQL时遇到的一个特殊字符转义的问题,特别是当使用hive-e命令执行SQL时,如何正确处理字符串中的小数点转义符。文中详细解释了在不同场景下(hive-f与hive-e)如何避免转义符导致的数据不一致问题。

原谅我张嘴可能就想骂人,当然跟别人无关,想骂的是自己太年轻,也顺便记录下这个注意点。

菜鸟一只,多多见谅!!

 

大家都知道,hive -f 后面指定的是一个文件,然后文件里面直接写sql,就可以运行hive的sql,hive -e 后面是直接用双引号拼接hivesql,然后就可以执行命令。

但是,有这么一个东西,我的sql当中有一个split切割,暂且先不管这个分割的业务逻辑是什么,但是当中有一段是用小数点(.)来分割字符串的,因为小数点是一个比较特殊的符号,所以前面要加上两个反斜杠来代表这是一个单纯的小数点(.),那么问题就来了!!

当我手动执行hive的时候,我是通过hive -f 执行的,得到的结果数据大约有5000W条,然而我把一样的sql放到kettle中执行(注:kettle中我不愿意在服务器的某个地方写个文件来存放sql,这样后面的人也不好维护,还要去服务器上看我的sql文本,所以kettle中我直接hive -e 执行),结果我发现kettle出来的数据只有50W,你说滑稽不滑稽。。。。

经过折磨,最后在同事的帮助下,我们发现,hive -e "要执行的sql",这种在引号里面使用2个反斜杠,会出现问题,具体什么问题,我还说不太清楚,但是双引号里面用2个反斜杠确实是会有些冲突(因为hive -f 没有使用到双引号,应该是把这个文本直接传入到hive的类当中,所以没有这样的问题)

因此使用hive -e "要执行的sql" 这种方式跑数据,千万千万看看有没有反斜杠,多关注下反斜杠和双引号是否会冲突,这里我测出来,如果要使用 \\ ,就要替换成\\\\

所以:

 select split(split(split(url,'/')[size(split(url,'/'))-1],'\\.')[0],'~')[0]

需要替换成

 select split(split(split(url,'/')[size(split(url,'/'))-1],'\\\\.')[0],'~')[0]

这样就没有问题了!F***K~

最后总结下:如果你在hive中直接执行该命令,那么就只能有\\否则不生效,如果是hive -e(或者说sql命令外面有双引号引起来的),那么就需要用\\\\

[root@hadoop1 jxl]# schematool -dbType derby -initSchema /usr/soft/apache-hive-3.1.2-bin/bin/hive-config.sh: line 72: export: `=': not a valid identifier /usr/soft/apache-hive-3.1.2-bin/bin/hive-config.sh: line 72: export: `/usr/soft/jdk1.8.0_161': not a valid identifier /usr/soft/apache-hive-3.1.2-bin/bin/hive-config.sh: line 73: export: `=': not a valid identifier /usr/soft/apache-hive-3.1.2-bin/bin/hive-config.sh: line 73: export: `/usr/soft/hadoop-3.3.0': not a valid identifier /usr/soft/apache-hive-3.1.2-bin/bin/hive-config.sh: line 74: export: `=': not a valid identifier /usr/soft/apache-hive-3.1.2-bin/bin/hive-config.sh: line 74: export: `/usr/soft/apache-hive-3.1.2-bin': not a valid identifier /usr/soft/apache-hive-3.1.2-bin/conf/hive-env.sh: line 55: HADOOP_HOME: command not found SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/soft/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/soft/hadoop-3.3.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory] Metastore connection URL: jdbc:mysql://hadoop001:3306/hive_18? characterEncoding=UTF-8 Metastore Connection Driver : com.mysql.jdbc.Driver Metastore connection User: root org.apache.hadoop.hive.metastore.HiveMetaException: Failed to load driver Underlying cause: java.lang.ClassNotFoundException : com.mysql.jdbc.Driver Use --verbose for detailed stacktrace. *** schemaTool failed ***
05-13
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值