根据事件

时间:2017-06-26 11:05:00

标签: scala apache-spark dataframe

我正在使用Scala,Apache Spark世界,我正在尝试了解如何创建一个“管道”,根据我收到的事件生成一个DataFrame。

例如,我的想法是,当我收到特定的日志/事件时,我必须在DF中插入/更新一行。

让我们举一个真实的例子。 我想创建一个DataFrame来表示我的数据库中存在的用户的状态(postgres,mongo等)。 当我说状态时,我指的是用户的当前状态(ACTIVE,INCOMPLETE,BLOCKED等)。这表示基于用户活动的更改,因此我将接收具有键“status”的日志(JSON):“ACTIVE”等等。

因此,例如,我正在接收来自Kafka主题的日志..在某些时候,我收到一个我感兴趣的日志,因为它定义了有关用户的有用信息(状态等...) 我拿这个日志,然后用这个日志创建一个DF。 然后我收到第二个日志,但是这个日志是由同一个用户执行的,所以行需要更新(如果状态当然改变了!)所以没有新行但是更新现有行。第三个日志,新用户,新信息因此存储为现有DF中的新行...等等。 在这个过程/管道的最后,我应该有一个DF,其中包含我的数据库中的所有用户的信息以及他们的"status",所以我可以说“哦,看看,有43个用户是{ {1}}和13 blocked!太棒了!“

这是一个想法..这个过程必须是实时的。

到目前为止,我已尝试使用未与kafka主题连接的文件。 例如,我的红色文件如下:

active

生成一个带有2行的DF,其中包含所有内容。

val DF = mysession.read.json("/FileStore/tables/bm2ube021498209258980/exampleLog_dp_api-fac53.json","/FileStore/tables/zed9y2s11498229410434/exampleLog_dp_api-fac53.json")
<{1>} +--------------------+-----------------+------+--------------------+-----+ | _id| _index|_score| _source|_type| +--------------------+-----------------+------+--------------------+-----+ |AVzO9dqvoaL5S78GvkQU|dp_api-2017.06.22| 1|[2017-06-22T08:40...|DPAPI| | AVzO9dq5S78GvkQU|dp_api-2017.06.22| 1|[null,null,[Wrapp...|DPAPI| +--------------------+-----------------+------+--------------------+-----+ 中有所有嵌套的东西(我提到的_source就在这里!)。

然后我选择了一些有用的信息,比如

status

再次,我们的想法是创建这个DF,其中包含来自kafka主题的日志,并在此DF中嵌入日志。 希望我解释得很好,我不想要一个“代码”解决方案,我更喜欢提示或示例如何实现这个结果。 谢谢。

1 个答案:

答案 0 :(得分:0)

在您寻找资源时,我建议如下: 看看Spark Streaming Programming Guide(https://spark.apache.org/docs/latest/streaming-programming-guide.html)和Spark Streaming + Kafka Integration Guide(https://spark.apache.org/docs/2.1.0/streaming-kafka-0-10-integration.html)。

使用Spark Streaming + Kafka集成指南获取有关如何使用Kafka内容打开Stream的信息。 然后在Spark Streaming Programming Guide中的“DStreams上的转换”一章中查看可以使用Spark Streaming执行的可能转换。 一旦您以可以对其执行最终操作的方式转换流,请查看Spark Streaming Programming Guide中的“DStream上的输出操作”。我认为特别是.forEachRDD可能是您正在寻找的 - 因为您可以为流的每个元素执行操作(例如检查字符串中是否存在某个关键字并基于此进行数据库调用)。