数据框记录查询问题

时间:2017-01-14 15:19:49

标签: scala apache-spark-sql spark-dataframe

环境: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中进行优化 由于
侯塞因

1 个答案:

答案 0 :(得分:2)

您可以按row_number的降序在severNamechannel的每个组合中创建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']
}