读取数据库数据和ElasticSearch数据进行连接处理

import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext; import com.dinpay.bdp.rcp.domain.FlowMain;
import com.dinpay.bdp.rcp.util.CodisUtil;
import com.dinpay.bdp.rcp.util.Constant;
import com.google.gson.Gson; import redis.clients.jedis.Jedis; /**
* 首页的数据,定时Job定时刷新
*/
public class MainFlowProcedure{
private static Logger logger = Logger.getLogger(MainFlowProcedure.class.getSimpleName()); public static void main(String[] args) { //屏蔽日志
Logger.getLogger("org.apache.spark").setLevel(Level.WARN); //配置SparkConf
SparkConf conf = new SparkConf().setAppName("MainFlowProcedure").setMaster("local[2]");
JavaSparkContext sc =new JavaSparkContext(conf);
SQLContext sqlContext = new SQLContext(sc); registerTable(sqlContext,"t_sys_attention_library");
registerTable(sqlContext,"t_sys_big_order");
registerTable(sqlContext,"t_sys_doubtful_order");
registerTable(sqlContext,"t_rc_event");
registerESTable(sqlContext, "t_order"); sqlContext.sql("select merchant_id,count(order_id) as txcnt ,sum(tx_money) as txamount from t_order group by merchant_id")
.registerTempTable("t_order_merchant"); sqlContext.sql("select t2.merchant_id,count(t1.order_id) as bigcnt from t_sys_big_order t1 join t_order t2 on t1.order_id = t2.order_id group by t2.merchant_id")
.registerTempTable("t_big_merchant"); sqlContext.sql("select t2.merchant_id,count(t1.order_id) as dbtcnt from t_sys_doubtful_order t1 join t_order t2 on t1.order_id = t2.order_id group by t2.merchant_id")
.registerTempTable("t_doubt_merchant"); sqlContext.sql("select merchant_id,count(*) as rccnt from t_rc_event group by merchant_id")
.registerTempTable("t_rc_merchant"); sqlContext.sql("select t1.merchant_id,t2.txcnt,t3.dbtcnt,t4.bigcnt,t2.txamount,t5.rccnt from t_sys_attention_library t1 left join t_order_merchant t2 on t1.merchant_id = t2.merchant_id left join t_doubt_merchant t3 on t1.merchant_id = t3.merchant_id left join t_big_merchant t4 on t1.merchant_id = t4.merchant_id left join t_rc_merchant t5 on t1.merchant_id = t5.merchant_id")
.registerTempTable("t_attention");
//生成结果集
DataFrame resultDF =sqlContext.sql("select t.merchant_id,t.txcnt,t.dbtcnt,t.bigcnt,t.txamount,t.rccnt from t_attention t"); List<FlowMain> flowMains = resultDF.javaRDD().map(new Function<Row,FlowMain>(){public FlowMain call(Row row){
         FlowMain flowMain = new FlowMain();
flowMain.setMerchantId(row.getString(0));
flowMain.setTxCnt(row.isNullAt(1)?0:row.getInt(1));
flowMain.setSuspectCnt(row.isNullAt(2)?0:row.getInt(2));
flowMain.setBigAmountCnt(row.isNullAt(3)?0:row.getInt(3));
flowMain.setTxAmount(row.isNullAt(4)?0.0:row.getDouble(4));
flowMain.setTxRate("偏高");
flowMain.setRcEventCnt(row.isNullAt(5)?0:row.getInt(5));
return flowMain;
}
}).collect(); Gson gson = new Gson();
String res = gson.toJson(flowMains);
//连接codis进行操作,每次将新生成的数据,放到对应的key中
Jedis jedis = CodisUtil.getJedis() ;
jedis.set("mainFlow", res);
logger.info("插入到Codis数据完成!!!");
sc.stop();
} //获取数据库的表注册为临时表
private static void registerTable(SQLContext sqlContext,String dbtable){
Map<String,String> mcOptions =new HashMap<String, String>();
mcOptions.put("url", Constant.URL);
mcOptions.put("driver", Constant.DRIVER);
mcOptions.put("dbtable", dbtable);
mcOptions.put("user", Constant.USER);
mcOptions.put("password", Constant.PASSWD);
DataFrame jdbcDF = sqlContext.read().format("jdbc").options(mcOptions).load();
jdbcDF.registerTempTable(dbtable);
} //获取ElasticSearch中的索引注册为表
private static void registerESTable(SQLContext sqlContext,String index){
Map<String,String> esOptions =new HashMap<String, String>();
esOptions.put("es.nodes", Constant.ESNODES);
esOptions.put("es.port", Constant.ESPORT);
esOptions.put("es.index.auto.create", "true"); DataFrame OrderDF = sqlContext.read().format("org.elasticsearch.spark.sql")
.options(esOptions)
.load(index+"/"+index);
OrderDF.registerTempTable(index);
} }

Spark sql读取数据库和ES数据进行处理代码的更多相关文章

  1. Spark SQL读取Oracle的number类型的数据时精度丢失问题

    Spark SQL读取数据Oracle的数据时,发现number类型的字段在读取的时候精度丢失了,使用的spark版本是Spark2.1.0的版本,竟然最后经过排查和网上查资料发现是一个bug.在Sp ...

  2. 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释

    在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...

  3. sql server2008数据库复制实现数据同步常见问题

    sql server2008数据库复制实现数据同步常见问题 在原作者基础上追加 sql server2008数据库复制实现数据同步常见问题 23.发布 'xx' 的并发快照不可用,因为该快照尚未完全生 ...

  4. spark SQL读取ORC文件从Driver启动到开始执行Task(或stage)间隔时间太长(计算Partition时间太长)且产出orc单个文件中stripe个数太多问题解决方案

    1.背景: 控制上游文件个数每天7000个,每个文件大小小于256M,50亿条+,orc格式.查看每个文件的stripe个数,500个左右,查询命令:hdfs fsck viewfs://hadoop ...

  5. sql server 数据库复制实现数据同步常见问题(不定期更新)

    sql server2008数据库复制实现数据同步常见问题 在原作者基础上追加 sql server2008数据库复制实现数据同步常见问题 23.发布 'xx' 的并发快照不可用,因为该快照尚未完全生 ...

  6. SQL跨数据库复制表数据

    SQL跨数据库复制表数据   不同服务器数据库之间的数据操作 不同数据库之间复制表的数据的方法: 当表目标表存在时: insert into 目的数据库..表 select * from 源数据库.. ...

  7. sql 读取excel中的数据

    select 列名 as 字段名 from openBowSet('MSDASQL.1','driver=Microsoft Excel Driver(*.xls);dbq=文件存放地址','sele ...

  8. C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

    C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Dat ...

  9. 用sql删除数据库重复的数据的方法

      /***********************************************两个意义上的重复记录:1.是完全重复的记录,也即所有字段均重复的记录,2.是部分关键字段重复的记录, ...

随机推荐

  1. [oldboy-django][2深入django]后台生成form标签并设置标签的属性

    # Form生成html标签 a. 通过Form生成Input输入框,Form标签,以及submit标签还是要在前端写的, 但是Form标签内的Input标签可以在后台实现:只需要按以下步骤 - vi ...

  2. POJ 2836:Rectangular Covering(状态压缩DP)

    题目大意:在一个平面内有若干个点,要求用一些矩形覆盖它们,一个矩形至少覆盖两个点,可以相互重叠,求矩形最小总面积. 分析: 数据很小,很容易想到状压DP,我们把点是否被覆盖用0,1表示然后放在一起得到 ...

  3. 多线程(继承Thread)

    /** *Thread的常用方法 *1.start(),启动线程再执行run方法 *2.run():子线程要执行的代码放入run()方法中 *3.currentThread()静态的,调取当前线程,返 ...

  4. 写js时常见错误

    最近几天写js时出现好多相同的错误,确实应该记下来了 ReferenceError: invalid assignment left-hand side 判断相等时把"=="写成& ...

  5. KM算法【带权二分图完美匹配】

    先orz litble--KM算法 为什么要用KM算法 因为有的题丧心病狂卡费用流 KM算法相比于费用流来说,具有更高的效率. 算法流程 我们给每一个点设一个期望值[可行顶标] 对于左边的点来说,就是 ...

  6. border-radius元素overflow:hidden失效问题

    父元素使用border-radius和overflow:hidden做成圆形,子元素如果使用了transform属性,则父元素的overflow:hidden会失效. 解决方法: 父元素使用 -wei ...

  7. [USACO15JAN]草鉴定Grass Cownoisseur (分层图,最长路,$Tarjan$)

    题目链接 Solution 水水的套路题. 可以考虑到一个环内的点是可以都到达的,所以 \(tajan\) 求出一个 \(DAG\) . 然后 \(DAG\) 上的点权值就是 \(scc\) 的大小. ...

  8. Python之面向对象:继承

    概念:子类继承父类的属性和方法. 一个派生类(derived class)继承基类(bass class)字段和方法.继承也允许把一个派生类的对象作为一个基类对象对待. 一.单继承 :推崇.特点和使用 ...

  9. 模板jinja2常用方法

    http://docs.jinkan.org/docs/jinja2/ 摘自 http://www.pythontip.com/blog/post/5455/ 数学运算       +, -, *,  ...

  10. js 如何生成一个不重复的ID的函数

    在MongoDB中的ObjectID,可以理解为是一个不会重复的ID,这里有个链接http://www.jb51.net/article/101164.htm感兴趣可以去研究一下. 我今天要做的就是做 ...