如何在Spark Structured Streaming中从Cassandra等外部商店读取Kafka和Query?
我从Kafka获得消息流,我想在其上应用Map操作,对于每个密钥,我想查询像Cassandra这样的数据存储区,并获取该密钥的更多信息,并在流上应用进一步的操作。我如何使用Spark Structured Streaming 2.2.0做到这一点?
答案 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