Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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 Dataframe-groupby访问groupedDataSet中以前的记录_Scala_Dataframe_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala Dataframe-groupby访问groupedDataSet中以前的记录

Scala Dataframe-groupby访问groupedDataSet中以前的记录,scala,dataframe,apache-spark,apache-spark-sql,Scala,Dataframe,Apache Spark,Apache Spark Sql,我有一个场景,需要根据PolicyNo计算PreviousPolicyNo。首先需要根据TransactionDate对数据进行排序。然后,我们必须检查此类保单期限是否在之前可用,如果是,则从该记录中获取最新可用的PolicyNo(在TransactionDate之前可用),并记入PreviousPolicyNo。如果此类PolicyTerm在过去不可用,则选择最新的PolicyNo可用(到目前为止),或者如果之前不存在任何期限(第一行),则将条目标记为null 比如说, 为了计算最后一个条目

我有一个场景,需要根据
PolicyNo
计算
PreviousPolicyNo
。首先需要根据
TransactionDate
对数据进行排序。然后,我们必须检查此类
保单期限是否在之前可用,如果是,则从该记录中获取最新可用的
PolicyNo
(在
TransactionDate
之前可用),并记入
PreviousPolicyNo
。如果此类
PolicyTerm
在过去不可用,则选择最新的
PolicyNo
可用(到目前为止),或者如果之前不存在任何期限(第一行),则将条目标记为null

比如说,

为了计算最后一个条目,我必须查找到目前为止可用的
PolicyTerm
-2的最后一个值(2014年12月12日之前),同样,对于最后一个条目,我必须查找可用的
PolicyTerm
3的最后一个记录(2014年12月12日之前)


我需要Scala实现方面的帮助,我实现了一个
UDF
(我在
列表[Struct]
中收集了这些列),但它在处理大型数据集时效果不佳。

可以使用窗口函数,因为它们同时允许分区和排序。但是,这两种情况需要单独的窗口功能。下面的
w1
对应于相同的
PolicyTerm
以前出现过的情况(因此被
PolicyTerm
分割),
w2
另一方面选择最新的
PolicyNo
,而不考虑
PolicyTerm

val w1 = Window.partitionBy("PolicyTerm").orderBy("TransactionDate")
val w2 = Window.orderBy("TransactionDate")

val df2 = df.withColumn("LagGroupPolicyNo", lag($"PolicyNo", 1).over(w1))
  .withColumn("LagPolicyNo", lag($"PolicyNo", 1).over(w2))
  .withColumn("PreviousPolicyNo", coalesce($"LagGroupPolicyNo", $"LagPolicyNo"))
  .drop("LagGroupPolicyNo", "LagPolicyNo")

如果我必须在这里处理多个PolicyID,您能建议我需要做哪些更改吗。@Sandeep:这应该很简单,只需在两个窗口中按
PolicyID
分区即可。更改为:
val w1=Window.partitionBy(“PolicyID”、“PolicyTerm”).orderBy(“TransactionDate”)
val w2=Window.partitionBy(“PolicyID”).orderBy(“TransactionDate”)