环境:Spark 1.6,Scala
您好
我在Dataframe中有像bellow
reportTime serverNAme channel viewer
2017-01-12 19:16:58.76 MTRL28DSERV722 Channel1 1192
2017-01-12 19:16:59.213 MTRL28DSERV722 Channel1 668
2017-01-12 19:17:05.193 BBBN23DSERV000 Channel1 795
2017-01-12 19:17:01.15 BBBN23DSERV000 Channel1 700
2017-01-12 19:16:58.76 MTRL28DSERV722 Channel3 100
2017-01-12 19:16:59.213 MTRL28DSERV722 Channel3 110
2017-01-12 19:17:05.193 BBBN23DSERV000 Channel3 200
2017-01-12 19:17:01.15 BBBN23DSERV000 Channel3 50
我需要输出:来自每个服务器的最新观众按频道 - 以便
2017-01-12 19:16:59.213 MTRL28DSERV722 Channel1 668
2017-01-12 19:17:05.193 BBBN23DSERV000 Channel1 795
2017-01-12 19:16:59.213 MTRL28DSERV722 Channel3 100
2017-01-12 19:17:05.193 BBBN23DSERV000 Channel3 200
我怎样才能得到结果?我不想将DF注册为temptable并在其上使用SQL,因为SQL未在Spark 1.6中进行优化
由于
侯塞因
答案 0 :(得分:2)
您可以按row_number
的降序在severName
和channel
的每个组合中创建reportTime
,然后使用where
过滤第一个import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.row_number
val w = Window.partitionBy($"serverNAme", $"channel").orderBy($"reportTime".desc)
df.withColumn("rn", row_number.over(w)).where($"rn" === 1).drop($"rn").show
+--------------------+--------------+--------+------+
| reportTime| serverNAme| channel|viewer|
+--------------------+--------------+--------+------+
|2017-01-12 19:17:...|BBBN23DSERV000|Channel3| 200|
|2017-01-12 19:16:...|MTRL28DSERV722|Channel3| 110|
|2017-01-12 19:17:...|BBBN23DSERV000|Channel1| 795|
|2017-01-12 19:16:...|MTRL28DSERV722|Channel1| 668|
+--------------------+--------------+--------+------+
每个组中的行应该是具有最新reportTime的那个:
app = Flask(__name__)
app.jinja_env.globals.update({
'latest_users': get_latest_users()
})
def get_latest_users() {
return ['Mark', 'Jane', 'Sally']
}