如何从Spark结构化流媒体中的Cassandra等外部商店中读取Kafka和Query?

时间:2017-09-07 08:03:59

标签: apache-spark apache-spark-sql

如何在Spark Structured Streaming中从Cassandra等外部商店读取Kafka和Query?

我从Kafka获得消息流,我想在其上应用Map操作,对于每个密钥,我想查询像Cassandra这样的数据存储区,并获取该密钥的更多信息,并在流上应用进一步的操作。我如何使用Spark Structured Streaming 2.2.0做到这一点?

2 个答案:

答案 0 :(得分:1)

Kafka结构化流可以与静态数据帧连接。根据{{​​3}},您可以执行此操作:

val staticDf = spark.read. ... // read from Cassandra
val streamingDf = spark.readStream. ... // read from stream


// example of join to get information from both Cassandra and stream
streamingDf.join(staticDf, "type")          // inner equi-join with a static DF
streamingDf.join(staticDf, "type", "right_join")  // right outer join with a static DF

答案 1 :(得分:0)

从kafka读取为流,

val spark = SparkSession
              .builder
              .appName("kafka-reading")
              .getOrCreate()

   val df = spark
           .readStream
           .format("kafka")
           .option("kafka.bootstrap.servers", "localhost:9092")
           .option("startingOffsets", "latest")
           .option("subscribe", topicName)
           .load()
           .selectExpr("CAST (key AS STRING)", "CAST (value AS STRING)").as[(String, String)]

如果数据帧的结构很复杂,那么在转换时你必须提供数据帧的模式。

要执行操作,首先需要使用水印在一定时间内累积某些数据,即10秒。加水印后,您可以应用groupBy以便对其进行聚合。将键和值收集为列表。然后通过遍历键列表,您可以使用键从cassandra中获取数据 有关如何进行水印和应用聚合的完整信息。 您可以参考Structured Streaming