zoukankan      html  css  js  c++  java
  • 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进行分解,简化计算。

  • 相关阅读:
    域名解析速度好快了。
    ASP生成图形(数字验证码)
    PHP过滤字符
    “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛F 最后一个是谁?(紫)
    “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛G 又是一个小游戏(蓝)
    面试题06 判断二叉树后序遍历的结果 [树]
    [acm] 动态规划相关的题目 [ 个人 ]
    [面试备] 暴搜 or 二分图的经典升级 : hdu 1045 Fire Net 示例 [ 二分图 ]
    面试题02 从上往下打印二叉树 【树】[ water ]
    面试题05 树的子结构 [树]
  • 原文地址:https://www.cnblogs.com/wangleBlogs/p/13212494.html
Copyright © 2011-2022 走看看