转载学习用:hiveQL自定义函数UDF,使用transform机制应用python脚本

  • 在写HiveQL的时候,往往发现内置函数不够用,Hive支持用户自定义函数UDF,使用Java进行开发。很多时候这显得过于繁重。因而Hive中提供了Transform机制(基于hadoopstreaming),这种机制相当于提供了一个脚本程序的入口,因此我们可以很方便的使用shell、perl、python等语言进行开发。Python是很简单易学开发效率也很高的一种脚本语言,虽然性能上不及Java和Cxx,但是在大多数情况下,特别是hadoop这样的分布式环境中,
  •  在写HiveQL的时候,往往发现内置函数不够用,Hive支持用户自定义函数UDF,使用Java进行开发。很多时候这显得过于繁重。因而Hive中提供了Transform机制(基于hadoop streaming),这种机制相当于提供了一个脚本程序的入口,因此我们可以很方便的使用shell、perl、python等语言进行开发。

     

     

    Python是很简单易学开发效率也很高的一种脚本语言, 虽然性能上不及Java和Cxx, 但是在大多数情况下, 特别是hadoop这样的分布式环境中,不会成为特别明显的性能瓶颈。

     

    hive中transform的标准语法是下面这样的:

     

    1. select transform(x, y, z....) using 'xxx.py' as (xx, yy, zz....) from .... 

     

    其中,xyz为待处理的字段,xxx.py即为我们的python脚本。

    在执行上面这个hiveql语句之前,需要将相应的脚本文件添加到环境中。

    使用add file xxx.py即可,这里的文件名不能加引号。

     

    python脚本可以采用下面这个框架:

     

    1. def main(): 
    2.     try: 
    3.         for line in sys.stdin: 
    4.           n = line.strip() 
    5.           #your code here... 
    6.           print  n 
    7.     except: 
    8.         return None 
    9.  
    10. if __name__ == "__main__": 
    11.     main() 

     


     

    hive会将每一行数据输出到python程序的标准输入中,处理完毕后,python将结果直接打印到标准输出,整个流程就完毕了。

     

    写完脚本后一定要注意测试,直接在命令行下手动输入数据,看看程序处理是否正常。

    这一点很重要,如果python程序本身有bug,则在hive语句执行的时候,会抛出broken piple之类异常,这类问题非常隐蔽,需额外注意。

     

    另外,select中的所有字段,最好全部包含在transform中,否则可能会出现莫名其妙的错误。

     

     

     

     

    本文出自 “Kevx's Blog” 博客,http://spinlock.blog.51cto.com/607469/976824

你可能感兴趣的:(python,hive)