在我的问题中,有一个关于包裹递送的信息数据流。数据包括" NumberOfPackages"," Action" (可以是"已加载","已交付"或"在过境")和"驱动程序"。
val streamingData = <filtered data frame based on "Loaded" and "Delivered" Action types only>
目标是在加载时和交付时查看包的数量,如果它们不相同 - 执行一个函数来调用REST服务,参数为&#34; TrackingId& #34;
数据如下所示:
+-----------------+-----------+-----------------------
|NumberOfPackages |Action |TrackingId |Driver |
+-----------------+-----------+-----------------------
|5 |Loaded |a |Alex
|5 |Devivered |a |Alex
|8 |Loaded |b |James
|8 |Delivered |b |James
|7 |Loaded |c |Mark
|3 |Delivered |c |Mark
<...more rows in this streaming data frame...>
在这种情况下,我们通过&#34; TrackingId&#34;等于&#34; c&#34;,加载和交付的包的数量不相同,因此我们需要使用&#34; TrackingId&#34来调用REST API ;
我想基于&#34; TrackingId&#34;组合行,这对于每次旅行总是唯一的。如果我们根据此跟踪ID得到组合的行,我们可以有两列用于包的数量,例如&#34; PackagesAtLoadTime&#34;和&#34; PackagesAtDeliveryTime&#34;。然后我们可以比较每一行的这两个值,并用不相等的数据帧过滤数据帧。
到目前为止,我已经尝试了使用&#34; TrackingId&#34;的groupByKey方法,但我找不到类似的例子,我的实验尝试都没有成功。
在我弄清楚如何&#34;合并&#34;两个具有相同跟踪ID的行并且每个对应的包数都有一列,我可以定义一个UDF:
def notEqualPackages = udf((packagesLoaded: Int, packagesDelivered: Int) => packagesLoaded!=packagesDelivered)
并使用它来过滤数据帧的行,以仅包含那些不匹配数字的行:
streamingData.where(notEqualPackages(streamingData("packagesLoaded", streamingData("packagesDelivered")))