首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Apache Pig如何通过自定义UDF查询数据库(五)

Apache Pig如何通过自定义UDF查询数据库(五)

作者头像
我是攻城师
发布于 2018-05-11 09:33:02
发布于 2018-05-11 09:33:02
1.3K00
代码可运行
举报
文章被收录于专栏:我是攻城师我是攻城师
运行总次数:0
代码可运行

GMV(一定时间内的成交总额)是一个衡量电商网站营业收入的一项重要指标,例如淘宝,京东都有这样的衡量标准,感兴趣的朋友可以自己科普下这方面的概念知识。 当然散仙今天,并不是来解释概念的,而是记录下最近工作的一些东西,原来我们平台的GMV只有一个总的成交金额,并没有细分到各个系统的GMV的比重,比如搜索端,推荐端,移动端等等。 通过细粒度的分析各个系统所占的比重,对于指导各个系统完善和发展有一定的重要意义,这里不就深说了,下面先来看下散仙分析的搜索gmv的数据布局方式。 (1)Hadoop集群上,存储了一些非核心的数据,比如访问数据,点击数据,购物车数据,下单数据(这个是从数据库里每天同步到HDFS上的,算是备份吧) (2)Oracle数据库中,存储了订单信息,交易信息,商品信息,支付信息等一些电商的核心数据 其实关于gmv的计算方式,在我们oracle库里,以及有一个存储过程封装了复杂的细节的处理,包括运费,折扣,不同国家,不同地域,信用用户,等等,在使用时候,只需要传入一个订单编号即可,计算出本单的gmv成交金额。 这样以来的,按照目前的数据情况,订单编号是从Hadoop集群上,一直是从搜索,点击,添加购物车,下单计算出来的,然后获取的对应的订单编号,注意这个过程中,是需要全程去爬虫数据的,因为还要算最终的GMV成交额,所以需要找到一定时期内的订单号,然后通过调用在oracle库的封装好的函数,计算出gmv,这样以来,就能够比较细跟踪各个阶段运行轨迹和成交额。 ok,业务上的分析大致如此,下面就看下,技术上如何实现,其实就是需要Pig的一个自定义UDF函数,在遍历每一行的recoder时,去查询oracle只读库,获取gmv的值,并将最终结果存储起来,以图形化方式展示。 Pig里面对UDF函数非常丰富,比较常用的是转化函数和加载存储函数,这一点在Hive里,也是如此,之前的文章中,散仙介绍过,通过自定义UDF将pig分析的结果直接存储到数据库或索引中,便于检索和发挥不同框架之间的组合优势。 核心代码如下:

Java代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.pig.dhgate.getgvmbyrfxno;    

import java.io.IOException;    

import org.apache.pig.EvalFunc;  
import org.apache.pig.data.Tuple;    
import org.slf4j.Logger;    
import org.slf4j.LoggerFactory;  
/** 
 * 自定义Pig UDF实现查询db计算gmv 
 * **/
public class GetGmvByRfxno extends EvalFunc<Double> {    
 /**日志对象*/
 static Logger log =LoggerFactory.getLogger(GetGmvByRfxno.class);  
 /**数据库工具类*/
   DBTools dbtools=new DBTools();  

 @Override
 public Double exec(Tuple input) throws IOException {  

 if(input!=null&&input.size()!=0){  
 //获取传入的订单号  
           String rfxno =(String)input.get(0);  
 //通过db类,查询对应的gmv并返回  
 double gmv=dbtools.getGmvByRfxno(rfxno);    
 return gmv;    
       }else{    
 //对null,空值,一律按0处理  
 return 0.00;    
       }  
   }  
}  

数据库封装类: 

Java代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/***
 * 数据库工具类
 * */
public class DBTools {
	
	/**日志对象*/
	static Logger log =LoggerFactory.getLogger(DBTools.class);
	
	
	private  static  Connection conn;
	private  static PreparedStatement ps;
	private   ResultSet rs;
	//从虚拟表查询函数
	private static  String  sql="select datasql.GETGMV(?) as gmv  from dual ";
	static{
		try{
		Class.forName("oracle.jdbc.driver.OracleDriver");
		conn = DriverManager.getConnection("jdbc:oracle:thin:@ip地址:1521:数据库名", "用户名", "密码");
		System.out.println("数据库连接:"+conn);
		ps=conn.prepareStatement(sql);
		}catch(Exception e){
			log.error("初始化oracle驱动异常!", e);
		}
	}
	
	/**根据一个rfxno获取对应的产品的gmv
	 * **/
	public double getGmvByRfxno(String rfxno){
		try{
		ps.setString(1, rfxno);
		rs = ps.executeQuery();
		if(rs.next()){
			double gmv=rs.getDouble("gmv");
//			System.out.println("gmv是:  "+gmv);
			return gmv;
		}
		rs.close();
		}catch(Exception e){
			log.error("根据rfxno获取gmv出错!",e);
		}
		return 0.0;
	}
	}

其实,代码还是比较简单的,在这里,你可以从任何数据源获取需要的数据,而不仅仅是数据库,你也可以从redis,memcache,文件,xml,等等里获取需要组合用的数据。 遇到一个异常:在sql语句后面,不用加分号,类似下面的这样的语句,通过jdbc编译然后调用oracle是不通过的:

Sql代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select datasql.GETGMV(?) as gmv  from dual;

这一点需要注意下。 最后来看下如下在pig脚本里,使用自定义的函数: (1)使用ant打包自定义的udf函数的jar (2)在pig脚本里,注册相关的jar包,注意如果有依赖关系,依赖的jar包,也需要注册,例如本例中的oracle的jdbc的驱动包 (3)在对应的地方,通过类的全路径名,引用此函数,完成对应的查询转换,并将新得到的一个字段,作为原始一行记录的字段扩充。 脚本如下:

Java代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--注册依赖的jar包
register /home/search/dongliang/nsconvent/checklist/ojdbc.jar
register /home/search/dongliang/nsconvent/checklist/tools.jar


--加载原有数据
m = load '/tmp/mdm/VW_TD_RFX' using PigStorage('\\x07');
--加载原有数据
n = load '/tmp/mdm/TD_RFX_PRODUCT' using PigStorage('\\x07');

--过滤出符合时间的数据

m= filter m by ToMilliSeconds(ToDate($3,'yyyy-MM-dd HH:mm:ss')) >= ToMilliSeconds(ToDate('$day 00:00:00','yyyy-MM-dd HH:mm:ss')) and ToMilliSeconds(ToDate($3
,'yyyy-MM-dd HH:mm:ss')) <= ToMilliSeconds(ToDate('$day 23:59:59','yyyy-MM-dd HH:mm:ss'))  ;

--提取相关字段,并完成计算
m = foreach m generate $0 as arfid, $1 as rfxno , com.pig.dhgate.getgvmbyrfxno.GetGmvByRfxno((chararray)$1) as gmv  , $4 as bid ;
--获取topN数据
m = limit m 10 ;
--打印输出
dump m;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
升级Oracle导致Java程序日期截断的场景
同事碰到个问题,他们的数据库从Oracle 11g升级到Oracle 19c,对应Java代码要将jdbc驱动从ojdbc14.jar升级到ojdbc7.jar,发现一个date参数的问题。
bisal
2025/07/24
990
升级Oracle导致Java程序日期截断的场景
如何给Apache Pig自定义UDF函数?
近日由于工作所需,需要使用到Pig来分析线上的搜索日志数据,散仙本打算使用hive来分析的,但由于种种原因,没有用成,而Pig(pig0.12-cdh)散仙一直没有接触过,所以只能临阵磨枪了,花了两天时间,大致看完了pig官网的文档,在看文档期间,也是边实战边学习,这样以来,对pig的学习,会更加容易,当然本篇不是介绍如何快速学好一门框架或语言的文章,正如标题所示,散仙打算介绍下如何在Pig中,使用用户自定义的UDF函数,关于学习经验,散仙会在后面的文章里介绍。 一旦你学会了UDF的使用,就意味着,
我是攻城师
2018/05/11
1.2K0
如何给Apache Pig自定义UDF函数?
近日由于工作所需,需要使用到Pig来分析线上的搜索日志数据,本人本打算使用hive来分析的,但由于种种原因,没有用成,而Pig(pig0.12-cdh)本人一直没有接触过,所以只能临阵磨枪了,花了两天时间,大致看完了pig官网的文档,在看文档期间,也是边实战边学习,这样以来,对pig的学习,会更加容易,当然本篇不是介绍如何快速学好一门框架或语言的文章,正如标题所示,本人打算介绍下如何在Pig中,使用用户自定义的UDF函数,关于学习经验,本人会在后面的文章里介绍。
星哥玩云
2022/07/03
5320
如何给Apache Pig自定义UDF函数?
图数据库与传统数仓实现联邦查询
•一、MySQL得到研报实体在Oracle中的唯一ID•二、Oracle中过滤时间序列数据•三、CYPHER实现MySQL和Oracle查询语句串联•四、通过apoc.case实现布尔值的判断•五、将查询封装为函数•六、将函数运用在数据过滤查询中•七、总结
马超的博客
2022/09/02
7330
图数据库与传统数仓实现联邦查询
玩转大数据系列之Apache Pig高级技能之函数编程(六)
已总结Pig系列的学习文档,点击末尾处,阅读原文即可查看所有,希望对大家有用,感谢关注! 在Hadoop的生态系统中,如果我们要离线的分析海量的数据,大多数人都会选择Apache Hive或Apache Pig,在国内总体来说,Hive使用的人群占比比较高, 而Pig使用的人相对来说,则少的多,这并不是因为Pig不成熟,不稳定,而是因为Hive提供了类数据库SQL的查询语句,使得大多人上手Hive非常容易,相反而Pig则提供了类Linux shell的脚本语法,这使得大多数人不喜欢使用。 如果在编程界
我是攻城师
2018/05/11
8840
【Oracle数据库】手滑删错数据,一步步教你如何挽救?
今天有客户联系说误更新数据表,导致数据错乱了,希望将这张表恢复到 一周前 的指定时间点。
Lucifer三思而后行
2021/12/30
9120
【Oracle数据库】手滑删错数据,一步步教你如何挽救?
【Oracle数据库】手滑删错数据,一步步教你如何挽救?
注意:为了模拟客户环境,假设无法通过UNDO快照找回,当前删除时间点为:<2021/06/17 18:10:00>。
Lucifer三思而后行
2021/08/17
4390
【Oracle数据库】手滑删错数据,一步步教你如何挽救?
一次慢查询暴露的隐蔽的问题
最近解决了一个生产 SQL 慢查询的问题,排查问题之后发现一些比较隐匿且容易忽略的问题。
andyxh
2019/09/10
5950
一次慢查询暴露的隐蔽的问题
用户自定义函数UDF
Hive支持的函数除了内置函数,允许编写用户自定义函数(User Define Function)来扩充函数的功能。
十里桃花舞丶
2021/09/10
3K0
Apache Pig学习笔记(二)
主要整理了一下,pig里面的一些关键词的含义和用法,pig虽然是一种以数据流处理为核心的框架,但数据库的大部分关键词和操作,在pig里面基本上都能找到对应的函数,非常灵活与简洁,春节前的最后一篇文章了,祝大家春节快乐! 1,pig里所有的保留关键字: -- A assert, and, any, all, arrange, as, asc, AVG -- B bag, BinStorage, by, bytearray, BIGINTEGER, BIGDECIMAL -- C cache, CAS
我是攻城师
2018/05/11
1.2K0
Apache Pig入门学习文档(一)
1,Pig的安装 (一)软件要求 (二)下载Pig (三)编译Pig 2,运行Pig (一)Pig的所有执行模式 (二)pig的交互式模式 (三)使用pig脚本执行模式 3,Pig Latin语句的声明 (一)加载数据 (二)使用和处理数据 (三)存储中间数据 (四)存储最终数据 (五)调试Pig Latin语言 4,Pig的属性值管理 5,Pig一些注意事项 1,Pig的安装 (一)软件安装 必须配置:
我是攻城师
2018/05/11
1.4K0
MySQL使用笔记
本文最后更新于 685 天前,其中的信息可能已经有所发展或是发生改变。 CREATE VIEW <视图名> AS <SELECT语句> 存储过程 mysql> delimiter $$  #将语句的结束符号从分号;临时改为两个$$(可以是自定义) mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER) -> BEGIN ->   DELETE FROM MATCHES -> WHERE playerno
Yuyy
2022/06/28
3480
【Apache Doris】自定义函数之C++ UDF详解
导读 本文主要分享 Apache Doris 1.2版本之前如何构建 C++ UDF。
一臻数据
2024/12/24
2210
【Apache Doris】自定义函数之C++ UDF详解
Hive自定义函数UDF、UDTF、UDAF入门
详细讲解Hive自定义函数UDF、UDTF、UDAF基础知识,带你快速入门,首先在Hive中新建表”apache_log”
星哥玩云
2022/08/16
3.2K0
Hive自定义函数UDF、UDTF、UDAF入门
进阶数据库系列(二十四):PostgreSQL 数据库日志与日常巡检
参考文章:https://blog.csdn.net/qq_33445829/article/ details/126578647 https://blog.csdn.net/qq_33445829 /article/details/126638945
民工哥
2023/08/22
1.6K0
进阶数据库系列(二十四):PostgreSQL 数据库日志与日常巡检
Apache Phoenix系列 | 真 · 从入门到精通
文章简介:Phoenix是一个开源的HBASE SQL层。它不仅可以使用标准的JDBC API替代HBASE client API创建表,插入和查询HBASE,也支持二级索引、事物以及多种SQL层优化。
王知无-import_bigdata
2019/09/03
6.3K0
Apache Phoenix系列 | 真 · 从入门到精通
java 保留小数与四舍五入以及时间日期的转换和excel读入与数据库写入
之前进行开发了一段小程序,开发过程中发现短短白来行的代码需要用到很多的知识现在进行总结
粲然
2023/10/12
3690
Oracle知识集锦:对Oracle数据库进行监控检查
execute dbbms_workload_repository.create_snapshot();
星哥玩云
2022/08/16
1.2K0
MySQL数据库结构设计
在编码过程中,如果MySQL数据结构设计不好的话,会大大影响开发人员编码效率。比如说MySQL数据库表设计不规范,创建时间字段设计成cjsj,创建者字段设计成cjr或者cjz。这样的数据库表可读性和表意性相当差。下面我们就来讲讲如何规范设计数据库结构。
用户2032165
2018/12/06
2.1K0
MySQL数据库结构设计
mybatis 批量插入「建议收藏」
开发项目中,总是与数据打交道,有的时候将数据放入到一个集合中,然后在遍历集合一条一条的插入,感觉效率超不好,最近又碰到这个问题,插入50条数据用了将近1s,完全满足不了系统的需求.效率必须加快,然后网上查询资料,历经千万bug,终于搞定,这里指提供mybatis中的配置,至于dao层的调用mybatis就自己上网查询下资料吧
全栈程序员站长
2022/07/25
1K0
相关推荐
升级Oracle导致Java程序日期截断的场景
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档