• HIVE中替换UDF神器-- TRANSFORM()函数


    TRANSFORM()

    在平时的hive开发中,虽然hive提供了一些比较丰富的内置函数,但是也不能完全的满足生产中的需要,对于一些逻辑,需要自定义UDF实现,但是又不想写UDF,还需要实现,就可以用TRANSFORM()方法

    TRANSFORM()方法可以看作是从一个表中读取了一些字段,但是其中的一些字段需要做一些处理,那么就可以使用TRANSFORM函数,通过调用我们写好的处理脚本,处理这段逻辑,比如python脚本等等。

    以HIVE官网中的一个例子为例讲解一下TRANSFORM函数的使用

    比如需要对一个时间戳转换为是周几,就是输入一个时间戳,返回这个时间戳是周几。

    TRANSFORM语法

    select
      transform(column1, column2,...)
      using 'python xxx.py'
      as (column1, column2,...)
    from
      tbl
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    简而言之,就是从一个表中读取字段,用python脚本处理,然后输出新的字段。
    那么python脚本怎么使用呢?
    python中通过sys.stdin来获取输入的字段,然后通过循环处理每一行数据即可

    for line in sys.stdin:
        xxx #处理逻辑
        print '\t'.join(column1, column2, ...)
    
    • 1
    • 2
    • 3

    处理起来很简单,借助python得天独厚的优点,可以很方便的处理复杂逻辑
    根据HIVE官方提供的案例,看一下
    传入字段,调用python脚本,处理,输出结果到hive表中

    python脚本编写

    将输入的参数由时间戳变为是周几输出

    import sys
    import datetime
    
    for line in sys.stdin:
      line = line.strip()
      # 切割传入的参数
      userid, movieid, rating, unixtime = line.split('\t')
      # 处理时间戳变为周几
      weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
      # 拼接结果输出
      print '\t'.join([userid, movieid, rating, str(weekday)])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    调用脚本

    INSERT OVERWRITE TABLE u_data_new
    SELECT
      -- 从u_data里面拿到的数据
      TRANSFORM (userid, movieid, rating, unixtime)
      -- 调用脚本处理传入参数
      USING 'python weekday_mapper.py'
      -- 输出到u_data_new的参数,将unixtime转变为了weekday
      AS (userid, movieid, rating, weekday)
    FROM u_data;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意:python脚本需要传入到集群内,调用时写上python脚本的路径,可以是集群的路径,也可以是hdfs的路径

  • 相关阅读:
    订单 延后自动关闭,五种方案优雅搞定!
    软件设计原则
    避坑版-OpenSSH 用户名枚举漏洞(CVE-2018-15473)
    【Vue】路由组件向app.vue主文件传值
    数据库方向上的九种职业
    JSD-2204-酷莎商城(后端)-Day17,18
    项目场景 with ERRTYPE = cudaError CUDA failure 999 unknown error
    java面试题:java中的单例设计模式及两种实现方法的代码举例
    MySQL数据库5.5.25a版本下载与安装
    python>>numpy(第二讲)
  • 原文地址:https://blog.csdn.net/weixin_46429290/article/details/125530835