我有两个数据框-一个是我的数据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)
....甚至无法编译。
所以我的问题有两个: