在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. 浅谈Laravel框架的CSRF

    前文 CSRF攻击和漏洞的参考文章: http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html Laravel默认是开启了CSRF功能, ...

  2. js实现的快速排序

    快速排序是一种平均性能非常优秀的排序算法,在很多场合都会应用到他. 了解快速排序于对开放高效率的软件有很重要的作用. 但是有不少的书本讲得并不是很清楚,而且不同的教材的实现方式也不尽相同, 我这里将最 ...

  3. django rest_framework 框架的使用02

    rest_framework 访问频率的限制(节流) 对于用户访问频率的显示,rest_framework 也有自己的类进行约束 先来一个自己的基于它的类的节流类的限制 class VisitCont ...

  4. Ubuntu 中安装 Docker

    检查 Device Mapper 是否存在 sch01ar@ubuntu:~$ ls -l /sys/class/misc/device-mapper 安装 Ubuntu 维护的版本 sch01ar@ ...

  5. Oracle NVL与NVL2函数

    nvl( ) 函数 从两个表达式返回一个非 null 值. 语法 NVL(eExpression1, eExpression2) 参数 eExpression1, eExpression2 如果 eE ...

  6. mysql性能优化-慢查询分析、优化索引和配置【转】

    一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connec ...

  7. css常用属性总结:颜色和单位

    在css代码编写中,估计颜色和单位是必不可少的,然而在css中关于颜色和单位值的写法有很多种写法,所以有必要把它弄清楚. 颜色 当初我在初学前端的时候,就会冒出一个疑问“我该如何设置网页颜色?”,一般 ...

  8. 110. Balanced Binary Tree (Tree; DFS)

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  9. leetcode 204 count prim 数素数

    描述: 给个整数n,计算小于n的素数个数. 思路: 埃拉托斯特尼筛法,其实就是普通筛子,当检测到2是素数,去除所有2的倍数:当检测到3是素数,去除其倍数. 不过这要求空间复杂度为n,时间复杂度为n. ...

  10. MongoDB增加用户认证: 增加用户、删除用户、修改用户密码、读写权限、只读权限

    1.添加并验证用户 > use admin> db.addUser("zjx","tsjianxin") #添加用户 > db.auth(&q ...