`
qindongliang1922
  • 浏览: 2183908 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117534
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125921
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59907
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71301
社区版块
存档分类
最新评论

玩转大数据系列之Apache Pig如何通过自定义UDF查询数据库(五)

    博客分类:
  • Pig
阅读更多


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分析的结果直接存储到数据库或索引中,便于检索和发挥不同框架之间的组合优势。

核心代码如下:
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;
		}
	}
}


数据库封装类:
/***
 * 数据库工具类
 * */
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是不通过的:
select datasql.GETGMV(?) as gmv  from dual;

这一点需要注意下。

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

脚本如下:
--注册依赖的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;





想了解更多有关电商互联网公司的搜索技术和大数据技术的使用,请欢迎扫码关注微信公众号:我是攻城师(woshigcs)
本公众号的内容是有关搜索和大数据技术和互联网等方面内容的分享,也是一个温馨的技术互动交流的小家园,有什么问题随时都可以留言,欢迎大家来访!






1
0
分享到:
评论

相关推荐

    hive自定义UDF编写函数.docx

    Hive 自定义 UDF 编写函数 本文主要讲解了 Hive 中自定义 UDF 函数的编写方法,包括创建 UDF 类、实现自定义函数逻辑、编译和打包 UDF jar 包、上传至 Hive 服务器并注册自定义函数。 一、创建 UDF 类 为了实现...

    HIVE自定义UDF函数

    而自定义用户定义函数(UDF)是 Hive 中的一个重要功能,允许用户根据自己的需求编写自定义函数,以便在 Hive 查询中使用。 如何在 Hive 中创建自定义 UDF 函数: 步骤一:编写 Java 程序 首先,您需要编写一个 ...

    apache pig 基础及应用

    apache pig 基础及应用,urldecode row_number web日志分析 根据 用户行为 做出 简易的 相似度 判断。

    精品课程推荐 大数据与云计算教程课件 优质大数据课程 19.Pig(共33页).pptx

    此外,Pig支持用户定义函数(UDF),允许用户自定义特定的数据处理逻辑,增强了其灵活性和可扩展性。 课程中还包括了其他关键的大数据组件,如: 1. 【Hadoop】:作为基础平台,Hadoop提供了分布式文件系统(HDFS...

    phoenix-udf自定义函数测试jar包

    phoenix-udf自定义函数,上传到hdfs的lib目录,测试udf自定义函数功能,有需要可以下载;select QUARTER(birth) from person

    pig udf 函数(urldecode row_number tomap)

    在大数据处理领域,Apache Pig 是一个非常重要的工具,它提供了一种高级的脚本语言(Pig Latin)来处理大规模数据集。用户定义的函数(User Defined Functions, UDFs)是 Pig 功能的重要组成部分,允许用户扩展其...

    Apache Pig的性能优化.pdf

    Apache Pig是在Hadoop之上构建的一个工具,它将Pig Latin脚本转换为一系列的MapReduce作业,然后在Hadoop集群上执行这些作业。这不仅简化了大数据处理的复杂性,还提高了数据处理的效率和速度。Hadoop提供了分布式...

    Hadoop大数据技术-pig操作

    例如,通过Hive的Pig UDF,可以在Pig中使用Hive的SQL查询功能。 总之,Hadoop上的Pig操作为大数据分析提供了强大且易用的工具,通过简单的Pig Latin脚本,用户可以高效地处理大规模数据,进行复杂的数据挖掘和分析...

    大数据系列-Hive

    5. **Hive UDF(用户自定义函数)**:Hive允许用户扩展其功能,自定义UDF、UDAF(用户自定义聚合函数)和UDTF(用户自定义转换函数),以处理特定的数据分析需求。 ### 0203 Hive 高级进阶 1. **Hive性能优化**:...

    【SparkSql篇02】SparkSql之自定义UDF和UDAF函数1

    SparkSQL 是 Apache Spark 的一个模块,它允许开发者使用 SQL 查询数据。在本篇文章中,我们将深入探讨如何在 SparkSQL 中创建和使用自定义用户定义函数(UDF)和用户定义聚合函数(UDAF)。首先,我们需要理解 ...

    hive自定义udf函数实战

    udf函数,用户自定义函数,可以直接在sql语句中计算的函数 优点: 允许实现模块化的程序设计、方便修改代码、增加函数 UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销,比存储方法的执行效率...

    Apache Hadoop---Pig.docx

    Apache Hadoop 中的 Pig 是一个强大的分布式数据分析引擎,专门设计用于处理大规模数据集。Pig 构建在 Hadoop 平台上,通过提供一个名为 Pig Latin 的高级抽象语言,简化了在 Hadoop 上进行数据分析的过程。Pig ...

    pig编程指南中的样例脚本、UDF、数据集

    《Pig编程指南》是一本深入讲解Apache Pig的权威书籍,它主要面向大数据处理和分析领域的开发者。在本书中,作者提供了丰富的样例脚本、用户定义函数(UDF)以及数据集,帮助读者理解并掌握Pig语言的精髓。Pig是...

    尚硅谷大数据技术之Hive1

    【尚硅谷大数据技术之Hive1】章节主要介绍了Hive的基本概念、优缺点、架构原理以及与传统数据库的比较。 1. **Hive是什么** Hive是由Facebook开源的一个数据仓库工具,专门用来处理海量的结构化日志数据统计。它...

    Spark自定义UDF分析Uber数据-内含源码以及设计说明书(可以自己运行复现).zip

    在Spark大数据处理中,用户定义函数(User Defined Functions, UDFs)是极其重要的工具,它们允许开发者将自定义逻辑引入到Spark SQL查询中。本项目以“Spark自定义UDF分析Uber数据”为主题,提供了源码和设计说明书...

    第九章 自定义标量_udf_UDFdescription_

    在Fluent这一流体动力学模拟软件中,自定义标量(UDF, User-Defined Functions)是用户根据特定需求扩展其功能的关键工具。UDF允许用户创建自己的计算方法,以处理非标准物理现象或者对已有模型进行微调。本章将深入...

    impala自定义日期处理的udf函数

    由于impala处理日期的函数如date_sub(),date_trunc(),last_day()等这些日期处理函数还需要进行日期格式化为yyyy-MM-dd使用,sql代码段过长,导致频繁嵌套过于复杂.所以自定义udf函数解决这些问题.以下为实现过程.

    udf_dpm_tongji.rar_DPM自定义_fluent udf多相流_tongji dpm_udf_dpm_tongj

    本话题聚焦于Fluent中的DPM(Discrete Particle Method)模型,以及如何通过用户自定义函数(UDF)来增强其功能,特别是针对颗粒的统计分析。下面将详细介绍这一领域的相关知识点。 首先,DPM模型是处理多相流问题...

Global site tag (gtag.js) - Google Analytics