Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 结构化流连接_Apache Spark_Spark Structured Streaming - Fatal编程技术网

Apache spark 结构化流连接

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

我使用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(“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模式中

希望有帮助