我有两个用Spark创建的Cassandra表。
现在我需要比较这两个表。
这是我的表格
Table A
Cols:
Name LastName Adress City
Table B
Cols
Adress City PostCode
地址并不总是一样的:街道可以是Strt,Str,St ......
我想做什么。检查表A的每一行的地址,并将它们与表B的每个地址进行比较。如果它们几乎相同,我会将邮政编码添加到表A中。
最好的方法是什么。我已经开始使用Solr Query但它似乎很慢。现在我正在尝试使用Spark连接,但我不确定我是否可以管理不完全相等的列的操作。
您认为最佳方法是什么?
答案 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
需要改组,所以它们的运行速度往往比map
或filter
等微不足道的转换慢得多。