文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

spark-sql中视图关联表结果不匹配问题

2020-08-03 00:15

关注

spark-sql中视图关联表结果不匹配问题

在sparkSQL 中将计算结果保存为视图,关联其他表后出现结果匹配错误,通过分析发现,是因为sql语句中使用了表达式

row_number() over(order by 1)

其实该表达式并没有执行,真正执行的时候是需要触发action (例如 show, count, top .......)算子的。或者在保存为视图之前,将结果持久化到内存中。

(1)结果不匹配

      println(" --------增加自增列,保存为视图----------- ")
      sqlBF.setLength(0)
      sqlBF.append(" select row_number() over(order by 1) as id, ")
      sqlBF.append("   a.* from students a                       ")
      val addId = sqlC.sql(sqlBF.toString)
      addId.createOrReplaceTempView("temp_addid")
      println(" --------增加自增列成功----------- ")


      println("---------视图关联其他表-------")
      sqlBF.setLength(0)
      sqlBF.append(" select a.id, a.student_name, a.class_id, ")
      sqlBF.append("        b.class_name, b.teacher,          ")
      sqlBF.append("     from  temp_addid  a,                 ")
      sqlBF.append("           class       b                  ")
      sqlBF.append("  where a.class_id = b.class_id           ")
      val results = sqlC.sql(sqlBF.toString)

      results.show()

(2)带表达式的,在保存为视图之前,将结果持久化到内存中

      println(" --------增加自增列,保存为视图----------- ")
      sqlBF.setLength(0)
      sqlBF.append(" select row_number() over(order by 1) as id, ")
      sqlBF.append("   a.* from students a                       ")
      val addId = sqlC.sql(sqlBF.toString)
      addId.persist() //持久化到内存中
      addId.createOrReplaceTempView("temp_addid")
      println(" --------增加自增列成功----------- ")


      println("---------视图关联其他表-------")
      sqlBF.setLength(0)
      sqlBF.append(" select a.id, a.student_name, a.class_id, ")
      sqlBF.append("        b.class_name, b.teacher,          ")
      sqlBF.append("     from  temp_addid  a,                 ")
      sqlBF.append("           class       b                  ")
      sqlBF.append("  where a.class_id = b.class_id           ")
      val results = sqlC.sql(sqlBF.toString)

      results.show()

(3)或者直接保存为table

println(" --------增加自增列,保存为视图----------- ")
      sqlBF.setLength(0)
      sqlBF.append(" select row_number() over(order by 1) as id, ")
      sqlBF.append("   a.* from students a                       ")
      val addId = sqlC.sql(sqlBF.toString)
      hc.saveTable(addId , "temp_addid  ") //保存为table
      println(" --------增加自增列成功----------- ")


      println("---------table关联其他表-------")
      sqlBF.setLength(0)
      sqlBF.append(" select a.id, a.student_name, a.class_id, ")
      sqlBF.append("        b.class_name, b.teacher,          ")
      sqlBF.append("     from  temp_addid  a,                 ")
      sqlBF.append("           class       b                  ")
      sqlBF.append("  where a.class_id = b.class_id           ")
      val results = sqlC.sql(sqlBF.toString)

      results.show()

  如果视图中没有使用类似的计算表达式,不做持久化操作,直接保存为视图,然后关联其他表是不会 影响结果的,使用视图只是将大量的SQL进行分解,简化计算。

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯