模糊匹配重复数据删除流处理的最佳实践

时间:2017-09-26 20:51:08

标签: apache-kafka bigdata apache-kafka-streams

我正在设计一个以读取的平面文件开头的数据管道。文件中的每一行都是一条记录。

加载后,每条记录都将被解析,转换和丰富。这种情况与其他记录无关。

作为最后一步,我希望基于几个记录字段的模糊匹配来重复记录记录。为此,我想得到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的一个很好的用例吗?

1 个答案:

答案 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'