Apache spark 结构化流连接
我使用Spark Structured Streaming 2.3的逻辑如下: 其中,我在id上连接两个流,然后输出连接流数据。不使用水印。这是一个简单的套接字流设置Apache spark 结构化流连接,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,我使用Spark Structured Streaming 2.3的逻辑如下: 其中,我在id上连接两个流,然后输出连接流数据。不使用水印。这是一个简单的套接字流设置 val df1=spark.readStream.format(“socket”).option(“主机”、“本地主机”).option(“端口”、“5431”).load() val df2=df1.as[String].map(x=>x.split(“,”)) val df3=df2.select($“value”(0).as
val df1=spark.readStream.format(“socket”).option(“主机”、“本地主机”).option(“端口”、“5431”).load()
val df2=df1.as[String].map(x=>x.split(“,”))
val df3=df2.select($“value”(0).as(“name”),$“value”(1).cast(IntegerType).as(“id”),$“value”(2).cast(TimestampType).as(“ts”))
val df1_1=spark.readStream.format(“socket”).option(“主机”、“本地主机”).option(“端口”、“5430”).load()
val df2_1=df1_1.as[String].map(x=>x.split(“,”)
val df3_1=df2_1.选择($“值”(0).as(“名称”),$“值”(1).cast(整数类型).as(“id”),$“值”(2).cast(时间类型).as(“ts”))
val joindf=df3.join(df3_1,df3(“id”)df3_1(“id”))
val res=joindf.writeStream.outputMode(“append”).trigger(trigger.ProcessingTime(15秒))
.format(“console”).option(“truncate”、“false”).start()
决议草案(
假设第一个触发器有两个数据流,如下所示:
df3:
vinyas,1,2018-03-17 09:04:21
namratha,2,2018-03-17 09:04:23
varsha,3,2018-03-17 09:04:33
df3_1:
vinyas,1,2018-03-17 09:04:21
shetty,2,2018-03-17 09:04:23
varsha,3,2018-03-17 09:04:33
vidya,2,2018-03-17 09:04:23
我得到了预期的结果:
-------------------------------------------
Batch: 0
-------------------------------------------
+--------+---+-------------------+------+---+-------------------+
|name |id |ts |name |id |ts |
+--------+---+-------------------+------+---+-------------------+
|vinyas |1 |2018-03-17 09:04:21|vinyas|1 |2018-03-17 09:04:21|
|varsha |3 |2018-03-17 09:04:33|varsha|3 |2018-03-17 09:04:33|
|namratha|2 |2018-03-17 09:04:23|shetty|2 |2018-03-17 09:04:23|
+--------+---+-------------------+------+---+-------------------+
下一步,输入流数据:
df3:
df3_1:
vinyas,1,2018-03-17 09:04:21
shetty,2,2018-03-17 09:04:23
varsha,3,2018-03-17 09:04:33
vidya,2,2018-03-17 09:04:23
获取输出为:
-------------------------------------------
Batch: 1
-------------------------------------------
+---------+---+-------------------+------+---+-------------------+
|name |id |ts |name |id |ts |
+---------+---+-------------------+------+---+-------------------+
|shrinivas|2 |2018-03-17 09:04:23|shetty|2 |2018-03-17 09:04:23|
|namratha |2 |2018-03-17 09:04:23|vidya |2 |2018-03-17 09:04:23|
|shrinivas|2 |2018-03-17 09:04:23|vidya |2 |2018-03-17 09:04:23|
+---------+---+-------------------+------+---+-------------------+
有人能解释一下我是如何得到第一批结果的吗?它应该不是4条记录而不是3条记录吗?根据官方的说法:
带可选水印的内连接
支持任何类型的列上的内部联接以及任何类型的联接条件。但是,随着流的运行,流状态的大小将无限期地增长,因为所有过去的输入都必须保存,因为任何新输入都可以与过去的任何输入匹配。为了避免无界状态,您必须定义额外的连接条件,以便无限期的旧输入无法与将来的输入匹配,因此可以从状态中清除。换句话说,您必须在联接中执行以下附加步骤
在两个输入上定义水印延迟,以便引擎知道输入的延迟程度(类似于流聚合)
定义跨两个输入的事件时间约束,以便引擎能够确定何时不需要一个输入的旧行(即不满足时间约束)来匹配另一个输入。可以通过以下两种方式之一定义此约束
时间范围连接条件(例如,在rightTime和rightTime之间的leftTime上连接+间隔1小时)
在事件时间窗口上加入(例如…在leftTimeWindow=rightTimeWindow上加入)
根据您的示例,您在追加模式下得到了正确的结果:
您在上一批结果中已经有此记录:
| namratha | 2 | 2018-03-17 09:04:23 | shetty | 2 | 2018-03-17 09:04:23 |
我的理解是,它不应该再出现在Append模式中
希望有帮助