Pyspark-按用户列出的最新记录并汇总结果
你能想出一个更简单的方法来实现这个结果吗 在本例中,我总结了每个“id”的结果。 这样做的目的是为每个用户带来最后一个值和总数 多谢各位Pyspark-按用户列出的最新记录并汇总结果,pyspark,summarization,Pyspark,Summarization,你能想出一个更简单的方法来实现这个结果吗 在本例中,我总结了每个“id”的结果。 这样做的目的是为每个用户带来最后一个值和总数 多谢各位 tmp= spark.createDataFrame( [ (1, '2020-02-17',10), (1, '2020-02-16',14), (1, '2020-02-15',19), (2, '2020-02-17',15), (2, '2020-02-19',9
tmp= spark.createDataFrame(
[
(1, '2020-02-17',10),
(1, '2020-02-16',14),
(1, '2020-02-15',19),
(2, '2020-02-17',15),
(2, '2020-02-19',9),
],
['id','date','value']
)
tmp.createOrReplaceTempView('tmp_sql')
ver_sum = spark.sql("""
SELECT id,
value
FROM tmp_sql as t
WHERE NOT EXISTS (
SELECT *
FROM tmp_sql AS witness
WHERE witness.id = t.id AND witness.date > t.date
)
""")
ver_sum.createOrReplaceTempView('ver_sum_sql')
spark.sql(""" select a.id,
a.value as last_value,
sum(b.value) as tot_value
from ver_sum_sql a
join tmp_sql b on a.id = b.id
group by 1,2
""").show()
+---+----------+---------+
| id|last_value|tot_value|
+---+----------+---------+
| 1| 10| 43|
| 2| 9| 24|
+---+----------+---------+
如果您经常需要这些最新信息,可以使用这些列(即id、last_值、tot_值)创建一个表,并使用原始表上的触发器更新此表
如果您想保持查询的工作,那么考虑更改SELECT*选择第一个查询1,以获得更好的性能,因为这个子查询只用于过滤,而不是选择所有的列,尽管一个好的优化器会自动优化它,但是在万一情况下改变它。 我不确定下一个技巧的性能,但是在第二个查询中,您可以首先找到值的总和,然后连接结果,否则连接的结果是一个大的临时数据,所以您可以尝试
选择lastv.id作为id, lastv.value作为最后一个值, 总和作为总价值 从ver_sum_sql作为lastv 参加 选择id,sumvalue作为sum 来自tmp_sql 按id分组 作为sumv 在lastv.id=sumv.id上