我们在使用pyspark,使用structureStreaming实时流的时候,创建出来的dataframe是流式的,不同于静态的df,流式的df使用的时候,不能用show()直接打印,而且使用sparkSQL的时候不可以在sql中使用开窗函数,并且还不可以使用join进行表关联
举个栗子:
执行以下代码会报错,因为在sql中使用了join进行表关联,而在流式的df中是不支持的
# 统计每个学生的得分最低的题目
# 以下方案不可取,报错 Join between two streaming DataFrames/Datasets is not supported in Complete output mode, only in Append output mode;
result04=spark.sql("""
with t as (
select student_id,min(score) minScore from temp_answer group by student_id
)
select t.*,t1.question_id from temp_answer t1 ,t where t.student_id =t1.student_id and t1.score = t.minScore
""")
再来一个例子:
这种sql也是不可以的,因为使用了开窗函数,也会报错
# dataframe 流不支持开窗函数
result04=spark.sql("""
select t1.student_id,t1.question_id,min(t1.score) over(partition by t1.student_id) minScore from temp_answer t1
""")
只能够这样写,但是还有一点问题,并不完全正确
# 以下这个语法是可以的,结果不对,因为第一个数据不一定是分数最低的题目
result04=spark.sql("""
select t1.student_id,min(score),collect_list(question_id)[0] from
temp_answer t1
group by t1.student_id
""")
标签:Datasets,t1,score,mode,student,sql,output,id
From: https://blog.csdn.net/qq_62984376/article/details/143865182