如何从具有最后时间戳的数据框中选择不同的记录
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;
【讨论】:
以上是关于如何从具有最后时间戳的数据框中选择不同的记录的主要内容,如果未能解决你的问题,请参考以下文章