Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 按最新时间戳重复Spark数据帧中的行_Apache Spark_Duplicates_Apache Spark Sql_Inner Join - Fatal编程技术网

Apache spark 按最新时间戳重复Spark数据帧中的行

Apache spark 按最新时间戳重复Spark数据帧中的行,apache-spark,duplicates,apache-spark-sql,inner-join,Apache Spark,Duplicates,Apache Spark Sql,Inner Join,我有一个具有以下模式的数据帧: root |- documentId |- timestamp |- anotherField 比如说, "d1", "2018-09-20 10:00:00", "blah1" "d2", "2018-09-20 09:00:00", "blah2" "d1", "2018-09-20 10:01:00", "blahnew" 注意,为了理解和方便起见,我将时间戳显示为字符串。事实上,这是一个很长的时间段,表示从新纪元开始的毫秒数 如图所示,第1行和第3行重

我有一个具有以下模式的数据帧:

root
|- documentId
|- timestamp
|- anotherField
比如说,

"d1", "2018-09-20 10:00:00", "blah1"
"d2", "2018-09-20 09:00:00", "blah2"
"d1", "2018-09-20 10:01:00", "blahnew"
注意,为了理解和方便起见,我将时间戳显示为字符串。事实上,这是一个很长的时间段,表示从新纪元开始的毫秒数

如图所示,第1行和第3行重复,具有相同的documentId,但时间戳不同,其他字段也可能不同。我希望对每个documentId重复并仅保留基于时间戳的最新行

一个简单的df.groupBydocumentId.aggmaxtimestamp。。。在这里似乎不太可能工作,因为我不知道如何在与满足maxtimestamp的字段对应的行中保留其他字段

所以,我想出了一个复杂的方法

// first find the max timestamp corresponding to each documentId
val mostRecent = df
    .select("documentId", "timestamp")
      .groupBy("documentId")
        .agg(max("timestamp"))

// now join with the original df on timestamp to retain
val dedupedDf = df.join(mostRecent, Seq("documentId", "timestamp"), "inner")
由此产生的重复数据DF应该只有与每个documentId的最新条目对应的行

虽然这样做有效,但我觉得这不是正确或有效的方法,因为我使用的是一个似乎不必要的连接


我怎样才能做得更好?我正在寻找基于纯数据帧的解决方案,而不是基于RDD的方法,因为DataBricks的员工在研讨会上反复告诉我们使用数据帧而不是RDD。

请参见下面的代码帮助您实现目标

val df = Seq(
  ("d1", "2018-09-20 10:00:00", "blah1"),
  ("d2", "2018-09-20 09:00:00", "blah2"),
  ("d1", "2018-09-20 10:01:00", "blahnew")
).toDF("documentId","timestamp","anotherField")

import org.apache.spark.sql.functions.row_number
import org.apache.spark.sql.expressions.Window

val w = Window.partitionBy($"documentId").orderBy($"timestamp".desc)
val Resultdf = df.withColumn("rownum", row_number.over(w))
     .where($"rownum" === 1).drop("rownum")

Resultdf.show()
输入:

+----------+-------------------+------------+
|documentId|          timestamp|anotherField|
+----------+-------------------+------------+
|        d1|2018-09-20 10:00:00|       blah1|
|        d2|2018-09-20 09:00:00|       blah2|
|        d1|2018-09-20 10:01:00|     blahnew|
+----------+-------------------+------------+
输出:

+----------+-------------------+------------+
|documentId|          timestamp|anotherField|
+----------+-------------------+------------+
|        d2|2018-09-20 09:00:00|       blah2|
|        d1|2018-09-20 10:01:00|     blahnew|
+----------+-------------------+------------+

请参阅下面的代码以帮助您实现目标

val df = Seq(
  ("d1", "2018-09-20 10:00:00", "blah1"),
  ("d2", "2018-09-20 09:00:00", "blah2"),
  ("d1", "2018-09-20 10:01:00", "blahnew")
).toDF("documentId","timestamp","anotherField")

import org.apache.spark.sql.functions.row_number
import org.apache.spark.sql.expressions.Window

val w = Window.partitionBy($"documentId").orderBy($"timestamp".desc)
val Resultdf = df.withColumn("rownum", row_number.over(w))
     .where($"rownum" === 1).drop("rownum")

Resultdf.show()
输入:

+----------+-------------------+------------+
|documentId|          timestamp|anotherField|
+----------+-------------------+------------+
|        d1|2018-09-20 10:00:00|       blah1|
|        d2|2018-09-20 09:00:00|       blah2|
|        d1|2018-09-20 10:01:00|     blahnew|
+----------+-------------------+------------+
输出:

+----------+-------------------+------------+
|documentId|          timestamp|anotherField|
+----------+-------------------+------------+
|        d2|2018-09-20 09:00:00|       blah2|
|        d1|2018-09-20 10:01:00|     blahnew|
+----------+-------------------+------------+

您没有使用正常意义上的重复行。请用足够的单词和句子清楚地说出你的意思。这里显然有多行具有相同的subrow值。您没有使用正常意义上的重复行。请用足够的单词和句子清楚地说出你的意思。这里显然有多行具有相同的子程序值。这是实现结果的最有效方法吗?这是实现结果的最有效方法吗?