我有这个DataFrame:
+----+------+--------------------+--------+-------------+
| id | name | end time | value | comment |
---------------------------------------------------------
|1 |node1 |2017-03-24 08:30:00 | 5 | blabla |
---------------------------------------------------------
|2 |node1 |2017-03-24 09:00:00 | 3 | blabla |
---------------------------------------------------------
|3 |node1 |2017-03-24 09:30:00 | 8 | blabla |
---------------------------------------------------------
|4 |node2 |2017-03-24 10:00:00 | 5 | blabla |
---------------------------------------------------------
|5 |node2 |2017-03-24 10:30:00 | 3 | blabla |
---------------------------------------------------------
|6 |node2 |2017-03-24 11:00:00 | 1 | blabla |
---------------------------------------------------------
|7 |node2 |2017-03-24 11:30:00 | 3 | blabla |
---------------------------------------------------------
|8 |node2 |2017-03-24 12:00:00 | 5 | blabla |
---------------------------------------------------------
我需要在2小时内找到值小于6的节点。我怎么能在Spark 1.6中做到这一点? 提前谢谢!
答案 0 :(得分:0)
编辑:这只适用于Spark 2.x
您可以使用窗口聚合函数:
df.groupBy(
col("name"),
window(col("end time"), "2 hour", "30 minute")
)
.agg(max("value").as("2_hour_max_value"))
.filter(col("2_hour_max_value") < 6)
.select("name")
.distinct()
答案 1 :(得分:0)
仅适用于HiveContext。因此,您必须创建hiveContext。
val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
为了利用hiveContext,必须将数据帧注册为临时表,并使用hiveContext在临时表上运行带有窗口功能的查询。
df.registerTempTable("dfTable")
val df = hiveContext.sql("""SELECT *,
row_number() over(partition by <partitionColum> order by <orderColumn> ) AS rank
FROM dfTabledfTable""")
答案 2 :(得分:0)
对于仍在使用 Spark 1.6 的用户:
需要使用hivecontext创建数据框。否则,hiveContext.sql将无法识别已注册的表。这是spark shell中的示例:
val hiveContext=new org.apache.spark.sql.hive.HiveContext(sc)
val someRDD=....
var someDF=hiveContext.createDataFrame(someRDD)
someDF=someDF.withColumnRenamed("_1","col1")....
someDF.registerTempTable("someTbl")
val ranked=hiveContext.sql("SELECT *, row_number() OVER(PARTITION by col1,col2,col3 order by col4 desc) AS rank FROM someTbl")
val maxCountPerGroup=ranked.filter(ranked("rank")===1).drop("rank")
maxCountPerGroup.coalesce(1).write.format("com.databricks.spark.csv").option("header", "true").save(output)