Cassandra Spark:如何比较两个表的元素?

时间:2017-08-03 10:42:27

标签: java apache-spark solr cassandra spark-cassandra-connector

我有两个用Spark创建的Cassandra表。

现在我需要比较这两个表。

这是我的表格

Table A

Cols:

Name LastName Adress City


Table B

Cols 

Adress City PostCode

地址并不总是一样的:街道可以是Strt,Str,St ......

我想做什么。检查表A的每一行的地址,并将它们与表B的每个地址进行比较。如果它们几乎相同,我会将邮政编码添加到表A中。

最好的方法是什么。我已经开始使用Solr Query但它似乎很慢。现在我正在尝试使用Spark连接,但我不确定我是否可以管理不完全相等的列的操作。

您认为最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

嗯,join绝对是正确的方法:)但是为了使用加入,你必须"协调"您的Address列,以便所有地址的格式都相同,并且" str"," st"和"街道"被翻译成一个统一的单词。你可以用UDF做到这一点:

使用UDF:

import org.apache.spark.sql.functions._
import spark.implicits._

val harmonise = udf((address: String) => ... //code that harmonises addresses)

tableA
  .select('Name, LastName, harmonise('Address) as "TableA_Address", 'City) 
  .join(tableB.select(harmonise('Address) as "TableB_Address", 'City, 'PostCode, 'TableA_Address === 'TableB_Address) 

你也可以使用map - 函数来完成它,但它有点麻烦;)

哦,作为最后一点 - joins需要改组,所以它们的运行速度往往比mapfilter等微不足道的转换慢得多。