【问题标题】:Pyspark - Lastest record by user and summarize resultsPyspark - 用户的最新记录并总结结果
【发布时间】:2020-02-21 14:10:08
【问题描述】:

你能想出一个更简单的方法来达到这个结果吗?

在这种情况下,我总结了每个“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|
+---+----------+---------+

【问题讨论】:

    标签: pyspark summarization


    【解决方案1】:

    如果您经常需要更新这些信息,您可以使用这些列(即 id、last_value、tot_value)创建一个表,并使用原始表上的触发器更新此表。

    如果您想继续处理查询,请考虑将第一个查询的 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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多