如何从具有最后时间戳的数据框中选择不同的记录

Posted

技术标签:

【中文标题】如何从具有最后时间戳的数据框中选择不同的记录【英文标题】:How to select distinct record from dataframe with last timestamp 【发布时间】:2017-10-06 16:43:31 【问题描述】:

我有数据框。我需要每个 ID 的基于 updateTableTimestamp 的表中的最新记录。 df.show()

+--------------------+-----+-----+--------------------+
|         Description| Name| id  |updateTableTimestamp|
+--------------------+-----+-----+--------------------+
|                    | 042F|64185|       1507306990753|
|                    | 042F|64185|       1507306990759|
|Testing             |042MF|  941|       1507306990753|
|                    | 058F| 8770|       1507306990753|
|Testing 3           |083MF|31663|       1507306990759|
|Testing 2           |083MF|31663|       1507306990753|
+--------------------+-----+-----+--------------------+

需要输出

+--------------------+-----+-----+--------------------+
|         Description| Name| id  |updateTableTimestamp|
+--------------------+-----+-----+--------------------+
|                    | 042F|64185|       1507306990759|
|Testing             |042MF|  941|       1507306990753|
|                    | 058F| 8770|       1507306990753|
|Testing 3           |083MF|31663|       1507306990759|
+--------------------+-----+-----+--------------------+

我试过了

sqlContext.sql("SELECT * FROM (SELECT *, row_number() OVER (PARTITION BY Id ORDER BY updateTableTimestamp DESC) rank from temptable) tmp where rank = 1")

它在分区上给出错误。线程“main”中的异常java.lang.RuntimeException: [1.29] failure: ``union'' expected but('发现`我使用的是spark 1.6.2

【问题讨论】:

“它给出错误” - 错误是什么? 尝试where tmp.rank = 1 或者尝试使用与rank 不同的别名,因为它是保留字。 不支持分区 【参考方案1】:
import org.apache.spark.sql.functions.first
import org.apache.spark.sql.functions.desc
import org.apache.spark.sql.functions.col

val dfOrder = df.orderBy(col("id"), col("updateTableTimestamp").desc) 

val dfMax = dfOrder.groupBy(col("id")).
          agg(first("description").as("description"),
              first("name").as("name"),
              first("updateTableTimestamp").as("updateTableTimestamp"))
        dfMax.show

之后,如果您想对字段重新排序,只需将 select 函数应用于您的新 DF。

【讨论】:

太棒了!埃里克巴拉哈斯谢谢【参考方案2】:

选择 描述、名称、id、updateTableTimestamp 从表名 身份证在哪里 (select id from table_name group by updateTableTimestamp) order by updateTableTimestamp desc;

【讨论】:

以上是关于如何从具有最后时间戳的数据框中选择不同的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何选择具有当天时间戳的行?

用于从表中选择具有最新时间戳的行的 JOOQ 代码

如何选择每个项目具有最大时间戳的行集?

熊猫合并具有不同时间戳的数据帧一

SQL查询以获取具有不同时间戳的多行

为每个员工选择一天中最早时间戳的完整记录[重复]