Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pyspark-按用户列出的最新记录并汇总结果_Pyspark_Summarization - Fatal编程技术网

Pyspark-按用户列出的最新记录并汇总结果

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

你能想出一个更简单的方法来实现这个结果吗

在本例中,我总结了每个“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_值、tot_值)创建一个表,并使用原始表上的触发器更新此表

如果您想保持查询的工作,那么考虑更改SELECT*选择第一个查询1,以获得更好的性能,因为这个子查询只用于过滤,而不是选择所有的列,尽管一个好的优化器会自动优化它,但是在万一情况下改变它。 我不确定下一个技巧的性能,但是在第二个查询中,您可以首先找到值的总和,然后连接结果,否则连接的结果是一个大的临时数据,所以您可以尝试

选择lastv.id作为id, lastv.value作为最后一个值, 总和作为总价值 从ver_sum_sql作为lastv 参加 选择id,sumvalue作为sum 来自tmp_sql 按id分组 作为sumv 在lastv.id=sumv.id上