我对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...
此联接从不返回任何内容。是什么导致此连接失败?我想我必须忽略一些基本的东西。
答案 0 :(得分:0)
与往常一样,编写Stackoverflow问题总是可以提供答案。这次以一种意想不到的方式...
输入上面的问题花了我几分钟时间,然后我再次检查了我的齐柏林飞艇笔记本。瞧,我现在得到了我想要的单张唱片。
连接速度非常慢,但是可以正常工作-花费了超过5分钟的时间才能产生结果。我从来没有等待足够长的时间。不,主题不是很大,仅保留几万条消息。
好吧,现在我知道该连接基本上可以正常工作了。我必须找出为什么它这么慢,以及如何加快它。
答案 1 :(得分:-1)
我不熟悉Pyspark,但我可以看到在Python中,比较运算符是==
而不是=
,就像您的代码一样。
请重新检查=
函数内的expr()
运算符做什么