最近在搞一些数据挖掘的东西。之前写的Python代码要放到hive上运行。记录一下踩的坑。
1. add、transform权限问题。
找了半天没有中文解决方案,只有英语解决方案,顺着找到了官方文档(英文):SQL Standard Based Hive Authorizationhttps://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorization#SQLStandardBasedHiveAuthorization-RestrictionsonHiveCommandsandStatements但是我照着改了配置,hive重启,然后崩了。。
hive只好退回改配置之前的版本。
后来同事改了个什么配置,现在又能用了。。
2. add file 的地址。
我add file 后面加本地服务器的地址貌似不行,需要先把文件上传到hdfs上。
hdfs dfs -put /usr/opt/datas/...../hive_unflod_specify.py(本地文件地址) /udf/hive_hql/(hdfs地址)
再从hdfs上传到hive上。
add file hdfs:///udf/hive_hql/hive_unflod_specify.py
3. Python debug之多文件问题。
用hive的transform跑代码,很崩溃的是你看不到报错信息,只知道是编译时出错还是运行时出错。
我用的debug方法是二分法,先用一个简单的.py文件把跑通,再把你的报错代码注释掉一部分。这样一步步通过控制变量的方法来定位bug。
我发现好像上传到hive上无法文件相互调用。还好这不是什么大问题,就把所有内容放到一个文件里去呗。
4. Python debug之编码问题。
hive默认的是ASCII码,这个码无法处理中文。所以如果要处理中文需要在文件头部加上以下代码:
import sys
#需要加载以下两行,否则无法导出中文。
reload(sys)
sys.setdefaultencoding('utf-8')
5. Python正则表达式问题。
hive上自带的Python是2.7.5版的,需要注意它与Python3版本存在不同。而且装包什么的还很麻烦,因为装包要先装pip,装pip需要装其它东西,而且如果是生产环境不联网又很麻烦。
正则表达式问题跟之前编码问题有关。例如这样的正则表达式在win上可以run,但在Linux+Python2.7上并不能提取出东西。
a='原告于2016年8月9日向国家知识产权局申请名称为“一种用于平板拖把挤水和清洗的拖把桶”的实用新型专利,于2017年4月12日获得授权,专利号为zl20162085××××.2,该专利至今有效。'
p4=re.compile('专利号为:?[zlZL]{0,2}[0-9×xX ]{8,16}\.[0-9×xX]',re.I)
p4.findall(a)
# 输出[]
通过用之前的二分法定位bug,发现是“?” 的问题,前面的“:”是Unicode字符。
解决方案是把正则表达式字符串和待匹配字符串都转换成‘utf-8’的形式,其中前者可以简写为前面加u:
a='原告于2016年8月9日向国家知识产权局申请名称为“一种用于平板拖把挤水和清洗的拖把桶”的实用新型专利,于2017年4月12日获得授权,专利号为zl20162085××××.2,该专利至今有效。'
p4=re.compile(u'专利号为:?[zlZL]{0,2}[0-9×xX ]{8,16}\.[0-9×xX]',re.I)
p4.findall(a.decode('utf-8'))
输出结果: