我正在设计一个以读取的平面文件开头的数据管道。文件中的每一行都是一条记录。
加载后,每条记录都将被解析,转换和丰富。这种情况与其他记录无关。
作为最后一步,我希望基于几个记录字段的模糊匹配来重复记录记录。为此,我想得到2条记录的所有组合。
目前我使用sql表作为缓冲区。我的表包含所有记录,我自己加入表格,on
条件不同的条件,名称与sounds like
的模糊匹配:
CREATE TABLE temp_tblSoundsLikeName AS
SELECT DISTINCT clients1.client_name client_name1,
clients1.client_id client_id1,
clients2.client_name client_name2,
clients2.client_id client_id2,
FROM tblClients clients1
JOIN tblClients clients2
ON clients1.client_name != clients2.client_name
AND clients1.ban_id < clients2.ban_id
AND SUBSTRING_INDEX(clients2.client_name,' ',1) SOUNDS LIKE SUBSTRING_INDEX(clients1.client_name,' ',1)
temp_tblSoundsLikeName中的记录表示重复,我将在tblClients中合并它们。
我在考虑使用Kafka Streams,这在过去我还没有使用过。当消息M
(表示记录R
)到达重复数据删除主题时,我希望我的应用程序使用它,因此生成包含来自R
和来自R'
的信息的消息另一条消息R'
,其中R
是过去5小时内到达重复数据删除阶段的任何消息。这些包含2条消息组合的消息应该发送到另一个主题,在那里可以通过匹配和模糊匹配条件进行过滤,最后一步是合并重复记录并使用kafka connect JDBC将合并记录推送到RDBMS。 / p>
但我不确定如何为所有此类R'
和def FrameStewart(ndisks,npegs):
if ndisks ==0: #zero disks require zero moves
return 0
if ndisks == 1 and npegs > 1: #if there is only 1 disk it will only take one move
return 1
if npegs == 3:#3 pegs is well defined optimal solution of 2^n-1
return 2**ndisks - 1
if npegs >= 3 and ndisks > 0:
potential_solutions = (2*FrameStewart(kdisks,npegs) + FrameStewart(ndisks-kdisks,npegs-1) for kdisks in range(1,ndisks))
return min(potential_solutions) #the best solution
#all other cases where there is no solution (namely one peg, or 2 pegs and more than 1 disk)
return float("inf")
a = int(raw_input("Disks [>] "))
b = int(raw_input("rods [>] "))
print FrameStewart(a, b) #prints 161
组合创建消息。
这可能吗?
这是Kafka Streams的一个很好的用例吗?
答案 0 :(得分:2)
使用Kafka的Streams API进行重复数据删除的起点是EventDeduplicationLambdaIntegrationTest.java
https://github.com/confluentinc/kafka-streams-examples(Confluent Platform 3.3.0 / Apache Kafka 0.11.0的直接链接:{{3} })。
方法isDuplicate
控制新事件是否被视为重复:
private boolean isDuplicate(final E eventId) {
long eventTime = context.timestamp();
WindowStoreIterator<Long> timeIterator = eventIdStore.fetch(
eventId,
eventTime - leftDurationMs,
eventTime + rightDurationMs);
boolean isDuplicate = timeIterator.hasNext();
timeIterator.close();
return isDuplicate;
eventIdStore
是一个所谓的&#34;状态商店&#34;,它可以让您记住过去事件中的信息,以便您可以做出#34;重复是/否?&# 34;决定。
当消息M(代表记录R)到达重复数据删除主题时,我希望我的应用程序使用它,并因此生成包含来自R和来自另一个消息R&#39;的信息的消息,其中R& #39;是过去5小时内到达重复数据删除阶段的任何消息。这些包含2条消息组合的消息应该发送到另一个主题,在那里可以通过匹配和模糊匹配条件进行过滤,最后一步是合并重复记录并使用kafka connect JDBC将合并记录推送到RDBMS。 / p>
您拥有的一个选项是执行&#34;给定新的R
,让我们找到所有R'
条消息,然后重复删除&#34;在一个步骤中,即在一个处理步骤中执行此操作(类似于上面的示例,使用所谓的Transformer
),而不是创建一堆新的下游消息,这会导致写入放大({{ 1}}下游消息)。状态存储可用于跟踪所有先前的消息,包括1 * R => N * "(R/R')"
到达时您感兴趣的各种R'
。