单个数据帧

时间:2017-12-23 00:22:06

标签: scala apache-spark apache-spark-sql spark-structured-streaming

在我的问题中,有一个关于包裹递送的信息数据流。数据包括" 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")))

0 个答案:

没有答案