Hive中执行php脚本

我们在做统计的时候可以会遇到一条hive语句解决不了的事情,需要执行php,python等脚本语言来辅助

在工作中遇到一个同恰到的需求,而签到的信息是存放在mybaby_tblappucloud表的ext字段 在ext的存在形式是{checkin:{201504:3,201503:8}}

其中key 201504对应value是3,我们的签到信息是通过位来存储3转换为二进制为11 代表4月份第一天和第二天都签到了


那么需求来了:统计4月分签到1天,2天,三天,4...............30天的有多少人?


这个需求直接用hive无法做,所有通过hive调用php脚本


select tmp.day,count(tmp.day)
(SELECT
  hk_ext['checkin']   --将选择出来的签到信息,一条条输入到 dealCheckin.php

USING
   '${hiveconf:HDFS_PHP} dealCheckin.php'   
  AS
   (day BIGINT)

  FROM
   mybaby_tblappucloud
  WHERE
   dt = '{@date}'
   AND hk_ext['checkin'] IS NOT NULL
  ) tmp group by tmp,day;


dealCheckin.php如下:

<?php
/***************************************************************************
 *
 * Copyright (c) 2015 Baidu.com, Inc. All Rights Reserved
 *
 **************************************************************************/
 
 
 
/**
 * @file dealCheckin.php
 * @author jiangzeyun
 * @date 2015/04/13 19:28:55
 * @brief
 * 
 **/

ini_set("error_reporting",E_ALL & ~E_NOTICE);
ini_set("display_errors","off");
ini_set("max_execution_time",0);
ini_set("memory_limit","10240M");
ini_set('date.timezone','Asia/Shanghai');
 
$strNowMon  = date('Ym',time());
$result=array();
$fp = fopen('php://stdin', 'r');
while($line = trim(fgets($fp))) {
    $checkin  = strval(urldecode($line));
 $checkin  = @json_decode($checkin, true);
 if(isset($checkin[$strNowMon]))
  {
  $totalDays = countOneInBinary(intval($checkin[$strNowMon]));

  print $totalDays."\n";
  }
}



/*
 * @brief   计算正数二进制表示时1的个数
 * @author  jiangzeyun
 * @思路:  利用 n & (n - 1) 可以将最后一个1变0,重复直到为0
 * @date    2015-03-11
 */
function countOneInBinary($int) {
 $num = 0;
 if ($int <= 0) {
  return $num;
 }

 while ($int != 0) {
  $num++;
  $int &= ($int - 1);
 }

 return $num;
}
 





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值