Pyspark - 用户最新记录和汇总结果
Pyspark - Lastest record by user and summarize results
你能想出更简单的方法来实现这个结果吗?
在这种情况下,我总结了每个 '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),
],
['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_value、tot_value)创建一个 table 并更新此 table 在原始 table.
上触发
如果你想保留对查询的工作,那么考虑将第一个查询的SELECT *
更改为SELECT 1
,以获得更好的性能,因为这个子查询只用于过滤,不用于选择所有列(虽然一个好的优化器会自动优化它,但以防万一更改它)。
我不确定下一个提示的性能,但是在第二个查询中你可以先找到值的总和然后连接结果(否则连接的结果是一个很大的临时数据),所以你可以试试
select lastv.id as id,
lastv.value as last_value,
sumv.sum as tot_value
from ver_sum_sql as lastv
join (
select id, sum(value) as sum
from tmp_sql
group by id
) as sumv
on lastv.id = sumv.id
你能想出更简单的方法来实现这个结果吗?
在这种情况下,我总结了每个 '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),
],
['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_value、tot_value)创建一个 table 并更新此 table 在原始 table.
上触发如果你想保留对查询的工作,那么考虑将第一个查询的SELECT *
更改为SELECT 1
,以获得更好的性能,因为这个子查询只用于过滤,不用于选择所有列(虽然一个好的优化器会自动优化它,但以防万一更改它)。
我不确定下一个提示的性能,但是在第二个查询中你可以先找到值的总和然后连接结果(否则连接的结果是一个很大的临时数据),所以你可以试试
select lastv.id as id,
lastv.value as last_value,
sumv.sum as tot_value
from ver_sum_sql as lastv
join (
select id, sum(value) as sum
from tmp_sql
group by id
) as sumv
on lastv.id = sumv.id