Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
Scala 使用Spark SQL joinWith,如何连接两个数据集,以便根据日期将当前记录与其以前的记录相匹配?_Scala_Apache Spark Sql_Dataset - Fatal编程技术网

Scala 使用Spark SQL joinWith,如何连接两个数据集,以便根据日期将当前记录与其以前的记录相匹配?

Scala 使用Spark SQL joinWith,如何连接两个数据集,以便根据日期将当前记录与其以前的记录相匹配?,scala,apache-spark-sql,dataset,Scala,Apache Spark Sql,Dataset,我试图使用joinWith在Spark SQL中连接两个仪表读数数据集,因此返回的类型是Dataset[(Reading,Reading)]。目标是根据日期列将第一个数据集中的每一行(称为当前)与其在第二个数据集中的上一条记录(称为上一条)相匹配 我需要首先在仪表键上加入,然后通过比较日期加入,找到下一个最大的日期,该日期小于当前读取日期(即上一个读取日期) 这是我尝试过的,但我认为这太琐碎了。我也得到了一个“无法解决”的错误与最大 val joined = Current.joinWith(

我试图使用joinWith在Spark SQL中连接两个仪表读数数据集,因此返回的类型是Dataset[(Reading,Reading)]。目标是根据日期列将第一个数据集中的每一行(称为当前)与其在第二个数据集中的上一条记录(称为上一条)相匹配

我需要首先在仪表键上加入,然后通过比较日期加入,找到下一个最大的日期,该日期小于当前读取日期(即上一个读取日期)

这是我尝试过的,但我认为这太琐碎了。我也得到了一个“无法解决”的错误与最大

val joined = Current.joinWith(
      Previous,
      (Current("Meter_Key") === Previous("Meter_Key"))
        && (Current("Reading_Dt_Key") > MAX(Previous("Reading_Dt_Key"))
    )

有人能帮忙吗?

没有尝试使用LAG,我想那也行。但考虑到您的需求,出于性能原因,决定应用一些逻辑。跳过了作业中的许多步骤。使用不同的名称,可以抽象、重命名和删除列

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
import spark.implicits._

case class mtr0(mtr: String, seqNum: Int)
case class mtr(mtr: String, seqNum: Int, rank: Int)

// Gen data & optimize for JOINing, just interested in max 2 records for ranked sets.
val curr0 = Seq(
mtr0("m1", 1),
mtr0("m1", 2),
mtr0("m1", 3),
mtr0("m2", 7)
).toDS

val curr1 = curr0.withColumn("rank", row_number()
                 .over(Window.partitionBy($"mtr").orderBy($"seqNum".desc)))

// Reduce before JOIN.
val currF=curr1.filter($"rank" === 1 ).as[mtr]
//currF.show(false) 
val prevF=curr1.filter($"rank" === 2 ).as[mtr]
//prevF.show(false) 

val selfDF = currF.as("curr").joinWith(prevF.as("prev"),
( col("curr.mtr") === col("prev.mtr") && (col("curr.rank") === 1) && (col("prev.rank") === 2)),"left")

// Null value evident when only 1 entry per meter.
selfDF.show(false)
返回:

+----------+----------+
|_1        |_2        |
+----------+----------+
|[m1, 3, 1]|[m1, 2, 2]|
|[m2, 7, 1]|null      |
+----------+----------+

selfDF: org.apache.spark.sql.Dataset[(mtr, mtr)] = [_1: struct<mtr: string, seqNum: int ... 1 more field>, _2: struct<mtr: string, seqNum: int ... 1 more field>]
+----------+----------+
|_1        |_2        |
+----------+----------+
|[m1,3,1]|[m1,2,2]|
|[m2,7,1]|空|
+----------+----------+
selfDF:org.apache.spark.sql.Dataset[(mtr,mtr)]=[\u1:struct,\u2:struct]

似乎有点像黑暗中的刺刀。我没有以这种方式使用MAX(MAX)。我建议您需要的是rank()。请在此自行加入?您是否可以按照协议接受正确的答案?