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

spark-sql中视图关联表结果不匹配问题在sparkSQL 中将计算结果保存为视图,关联其他表后出现结果匹配错误,通过分析发现,是因为sql语句中使用了表达式 row_number() over(order by 1) 其实该表达式并没有执

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

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

row_number() over(order by 1)

代码100分

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

(1)结果不匹配

代码100分      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

代码100分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进行分解,简化计算。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7655.html

(0)
上一篇 2023-03-16
下一篇 2023-03-16

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注