通过计算构建动态联接表达式

时间:2018-08-01 16:38:51

标签: scala apache-spark

我有两个数据框-一个是我的数据df,另一个是需要应用于数据filterDF的过滤器,即

数据

+---------+--------+-----------+
|FirstName|LastName|        SSN|
+---------+--------+-----------+
|     John|   Smith|123-12-1234|
|   Marsha|   Smith|321-32-4321|
+---------+--------+-----------+

过滤器

+---------+--------+-----------+
|FirstName|LastName|        SSN|
+---------+--------+-----------+
|      Jon|   Smith|123-22-1234|
+---------+--------+-----------+

搜索过滤器1)是动态的2)需要有些模糊(我正在尝试计算levenshtein距离)。因此,某人可以仅按名字或按多个条件进行搜索-并且上述情况表示的搜索应返回John Smith的行。我正在寻找在Spark Scala中实现此功能的最佳方法(我相对较新)。目前,我可以按任意数量的条件成功过滤...如果我在过滤器中进行硬编码:

val joinExpr = levenshtein(df("FirstName"), filterDF("FirstName")) < 4 && levenshtein(df("LastName"), filterDF("LastName")) < 4 && levenshtein(df("SSN"), filterDF("SSN")) < 4

val joined = df.join(
  filterDF,
  joinExpr
)

但是,我一直未能成功生成该表达式。.我尝试过:

val joinExpr = selects.map(v => levenshtein(df(v), filterDF(v)) < 4).mkString(" && ")

selects是要过滤的列的列表-这不起作用,因为表达式只是一个字符串,并被解释为应该作为一列。

只要做:

val joinExpr = selects.map(v => levenshtein(df(v), filterDF(v)) < 4)

....甚至无法编译。

所以我的问题有两个:

  1. 是否有一种方法可以动态构建我要寻找的联接表达式?
  2. 除了联接之外,还有没有更有效的方法来实现此功能?我尝试构建过滤器,但遇到类似问题...

0 个答案:

没有答案