Spark结构化的流连接无法正常工作

时间:2019-04-14 20:39:34

标签: apache-spark apache-kafka

我对Spark结构化流媒体还很陌生,并且我试图将来自Kafka主题(Spark 2.3.2,Kafka 2.0)的多个流连接在一起。

在流上可以很好地进行连接,在这里我可以对键进行简单的等值连接。对于来自2个主题的一个特定联接,我必须进行一些数据转换,因为在一个主题上,联接密钥以十六进制编码,而在另一个主题上,联接密钥则在base64中编码。

经过大量调试,我找到了以下代码,正在PySpark Zeppelin笔记本中进行测试。 2个主题流存储在Python字典中

debug = (topicStreams['invprop']
   .where("invpropv.PHC_UID_IPID = '183C1BA9B3444919B6C33DAB0B639A87'")
   .writeStream.outputMode("append").format("memory")
   .queryName("debug").start()
)

正如我期望的那样,这恰好返回了第一个主题的一条消息

debug2 = (topicStreams['hca']
   .where("hex(unbase64(hcav.id)) = '183C1BA9B3444919B6C33DAB0B639A87'")
   .writeStream.....

第二个流还返回一条消息,这些消息当然是我要加入的2条消息。我想我可以假设这些键确实匹配。

debug3 = (topicStreams['invprop']
   .join(topicStreams['hca'], 
         expr("invpropv.PHC_UID_IPID = hex(unbase64(hcav.id))"))
   .writeStream...

此联接从不返回任何内容。是什么导致此连接失败?我想我必须忽略一些基本的东西。

2 个答案:

答案 0 :(得分:0)

与往常一样,编写Stackoverflow问题总是可以提供答案。这次以一种意想不到的方式...

输入上面的问题花了我几分钟时间,然后我再次检查了我的齐柏林飞艇笔记本。瞧,我现在得到了我想要的单张唱片。

连接速度非常慢,但是可以正常工作-花费了超过5分钟的时间才能产生结果。我从来没有等待足够长的时间。不,主题不是很大,仅保留几万条消息。

好吧,现在我知道该连接基本上可以正常工作了。我必须找出为什么它这么慢,以及如何加快它。

答案 1 :(得分:-1)

我不熟悉Pyspark,但我可以看到在Python中,比较运算符是==而不是=,就像您的代码一样。
请重新检查=函数内的expr()运算符做什么