在spark-streming 中调用spark-sql时过程遇到的问题

使用版本:spark-2.1.0

JDK1.8

1. spark-sql中对limit 的查询结果使用sum() 聚合操作不生效

如下sql会报出 top10_sts 存在异常。

SELECT
SUM(mtime_show_times) AS top10_sts
FROM
tb_movie_bo_pt_params
ORDER BY mtime_persion_times DESC
LIMIT 10

改成如下sql逻辑正常执行

SELECT
SUM(mtime_show_times) AS top10_sts
FROM
(SELECT
*
FROM
tb_moive_bo_pt_params
ORDER BY mtime_persion_times DESC
LIMIT 10) a

2. spark-sql中使用union 连接两个表;再将union结果进行过滤 != 操作不生效问题。

SELECT
'ALL_MOVIE' AS movie_id,
SUM(no_sale) AS persion_times,
COUNT(1) AS show_times
FROM
tb_bo_real_time
WHERE biz_date = '#{var_date}'
UNION
SELECT
'ALL_MOVIE2' AS movie_id,
'2017-12-31' AS persion_times,
'1123' AS show_times

基于union 的结果生成的临时表 temp_tb;

执行如下操作得不到预期的结果:

SELECT
*
FROM
temp_tb
WHERE movie_id != 'ALL_MOVIE'

这 可能是spark的bug,经过调试后发现,使用 union关键字之后就会出现该问题。

测试发现有2种解决办法:

  • 将uinon的两部分分别使用sql计算,之后在使用RDD的union操作,将两个数据集合合并起来。
    val movie_summary_realtime_Df = sparkSession.sql(config.getProperty("test_union_sql").replace("#{var_date}", biz_date))
movie_summary_realtime_Df.collect().foreach(println)
println("-----------movie_summary_realtime_all_Df------------------")
val movie_summary_realtime_all_Df = sparkSession.sql(config.getProperty("test_union_sql_all").replace("#{var_date}", biz_date))
movie_summary_realtime_all_Df.collect().foreach(println)
println("-----------union_Df------------------") val unioDf = movie_summary_realtime_Df.union(movie_summary_realtime_all_Df)
unioDf.collect().foreach(println)
unioDf.createOrReplaceTempView("tb_bo_movie_summary_realtime") println("-----------test filter------------------")
val test_DF = sparkSession.sql("SELECT movie_id FROM tb_bo_movie_summary_realtime WHERE movie_id != 'ALL_MOVIE'")
test_DF.collect().foreach(println)
  • 将相关依赖表cache后,再进行sql操作。
    val movie_summary_realtime_Df = sparkSession.sql(config.getProperty("tb_bo_movie_summary_realtime").replace("#{var_date}", biz_date))
movie_summary_realtime_Df.cache()

3. spark 内存快照的更新

  def updateSeatMapState(moviesKey: String, seatMap: Option[JSONObject], state: State[JSONObject]) = {
var newValue:JSONObject = seatMap match {
case None => { val temp =state.get();temp;}
case _ => { state.update(seatMap.get);seatMap.get; }
}
val output = (moviesKey, newValue)
output
}
  • 当前值Option[JSONObject] 有可能为none,state.update(none) 会有空指针异常,造成程序退出。
  • 当前值Option[JSONObject] 为none时,有两种情况。一种是业务确实为空;另一种是当前key已经过期了。

    不管那种情况,都不需要更新state的值。
  • 如果一个state的可以过期了,再调用state.update()就会报出一个更新过期Key的异常,后程序退出。
  • 状态值如果不设置过期,就会一直存在,系统长时间运行性能会越来越差,并出现内存溢出,而异常退出。
  • 更新方法需要返回值。
java.lang.IllegalArgumentException: requirement failed: Cannot update the state that is timing out
at scala.Predef$.require(Predef.scala:224)
at org.apache.spark.streaming.StateImpl.update(State.scala:156)
at com.mtime.bigdata.bo.RealTimeBoxOfficeCluster$.updateSeatMapState(RealTimeBoxOfficeCluster.scala:110)
at com.mtime.bigdata.bo.RealTimeBoxOfficeCluster$$anonfun$6.apply(RealTimeBoxOfficeCluster.scala:72)
at com.mtime.bigdata.bo.RealTimeBoxOfficeCluster$$anonfun$6.apply(RealTimeBoxOfficeCluster.scala:72)
at org.apache.spark.streaming.StateSpec$$anonfun$1.apply(StateSpec.scala:181)
at org.apache.spark.streaming.StateSpec$$anonfun$1.apply(StateSpec.scala:180)
at

spark-streming 中调用spark-sql时过程遇到的问题的更多相关文章

  1. C#在父窗口中调用子窗口的过程(无法访问已释放的对象)异常,不存在从对象类型System.Windows.Forms.DateTimePicker到已知的托管提供程序本机类型的映射。

    一:C#在父窗口中调用子窗口的过程(无法访问已释放的对象)异常 其实,这个问题与C#的垃圾回收有关.垃圾回收器管 理所有的托管对象,所有需要托管数据的.NET语言(包括 C#)都受运行库的 垃圾回收器 ...

  2. (转)C#在父窗口中调用子窗口的过程(无法访问已释放的对象)

    C#在父窗口中调用子窗口的过程: 1. 创建子窗口对象 2. 显示子窗口对象   笔者的程序中,主窗体MainFrm通过菜单调用子窗口ChildFrm.在窗体中定义了子窗口对象,然后在菜单项点击事件中 ...

  3. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  4. C#中调用Windows API时的数据类型对应关系

    原文 C#中调用Windows API时的数据类型对应关系 BOOL=System.Int32 BOOLEAN=System.Int32 BYTE=System.UInt16 CHAR=System. ...

  5. 又踩.NET Core的坑:在同步方法中调用异步方法Wait时发生死锁(deadlock)

    之前在将 Memcached 客户端 EnyimMemcached 迁移 .NET Core 时被这个“坑”坑的刻骨铭心(详见以下链接),当时以为只是在构造函数中调用异步方法(注:这里的异步方法都是指 ...

  6. Titanium中调用ios组件时语言不是本地化的解决方法

    用Titanium开发的ios应用中,当调用系统组件时,尽管手机已经设置了系统语言为中文,但那些组件的界面却仍为英文.比如调用iphone中的相册组件,其界面为: 那么怎么让它跟系统语言保持一致呢? ...

  7. react 在 componentWillMount() 中调用异步函数时,componentWillMount() finishes after render()

    刚开始使用 react,很多属性.方法不是很熟.在此记录下我所遇到的问题及解决方法. 我在 componentWillMount() 中调用了一个异步函数,在返回结果中调用 this.setState ...

  8. 项目中调用ExcelCom组件时的配置流程

    异常提示如下:         Microsoft Office Excel 不能访问文件“*.xls”. 可能的原因有:        1 文件名称或路径不存在.       2 文件正被其他程序使 ...

  9. Spark DataFrame中的join使用说明

    spark sql 中join的类型 Spark DataFrame中join与SQL很像,都有inner join, left join, right join, full join; 类型 说明 ...

  10. FORM中调用JAVA组件

    调用方式: 链接:可以在一个数据块中创建专门的 Bean Area项,使用 Implementation Class 特性链接到J a v a B e a n,使用W h e n - C u s t ...

随机推荐

  1. mysql 8.0 初识

    1 下载并安装mysql 8.0官网下载比较慢,这里选择163的镜像http://mirrors.163.com/mysql/Downloads/MySQL-8.0/下载版本mysql-8.0.14- ...

  2. Hive任务优化--控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...

  3. Linux服务器安全之用户密钥认证登录

    转自:http://blog.sina.com.cn/s/blog_6561ca8c0102vb0d.html 一. 密钥简介 在Linux下,远程登录系统有两种认证方式:密码认证和密钥认证.密码认证 ...

  4. 条件随机场(CRF)-IIS学习算法

    改进的迭代尺度法(Improved Iterative Scaling),在很多模型求解中用到,比如最大熵.CRFs等,对模型是对数线性模型的似然都适用.这个算法的思想也很简单,通俗的理解就是通过两个 ...

  5. C++11新特性介绍 02

    阅读目录 1. 范围for语句 2. 尾置返回类型 3. =default 生成默认构造函数 4. 类对象成员的类内初始化 5. lambda表达式与bind函数 6. 智能指针share_ptr,u ...

  6. IOS 证书失效

    IOS 证书失效,能选择ppf,选择不了证书. [Error] No certificate found in provisioning profile "aee9b804-bc71-4ce ...

  7. JSF多列预选择

    <script type="text/javascript"> jQuery(document).ready(function () { preSelect(); }) ...

  8. 10 MySQL--权限管理

    权限管理 1.创建账号 # 本地账号 create user '; # mysql -uegon1 -p123 # 远程帐号 create user '; # mysql -uegon2 -p123 ...

  9. 初认识ZK

    转自:https://www.jianshu.com/p/8e322462bcca 前言: 前段时间做了sdk直播服务,由于给游戏接入,所以必须要考虑并发性能问题,大家知道直播聊天,房间人数多了的话是 ...

  10. linux sudo 系统环境变量 用户环境变量

    1. sudo就是普通用户临时拥有root的权限.好处在于,大多数时候使用用户自定义的配置,少数情况可以通过sudo实现root权限做事. 故而,需要注意的一点是,在你使用了sudo后,你临时不再是原 ...