在sparkSQL 中將計算結果保存為視圖,關聯其他表後出現結果匹配錯誤,通過分析發現,是因為sql語句中使用了表達式 row_number() over(order by 1) 其實該表達式並沒有執行,真正執行的時候是需要觸發action (例如 show, count, top .......) ...
在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進行分解,簡化計算。