Spark Scala:在DataFrame中替换过滤器表达式的问题

时间:2016-11-06 20:44:07

标签: scala apache-spark spark-dataframe

我创建了一个数据框,它保存了2个表的连接。

我想比较table1的每个字段和table2的字段(Schema是相同的)  表A中的列= colA1,colB1,colC1,...  表B中的列= colA2,colB2,colC2,...  所以,我需要过滤掉满足条件的数据

(colA1 = colA2)AND(colB1 = colB2)AND(colC1 = colC2)等。  由于我的表有很多字段,我试图建立一个类似的exp。

 val filterCols = Seq("colA","colB","colC")
 val sq = '"'
 val exp = filterCols.map({ x => s"(join_df1($sq${x}1$sq) === join_df1($sq${x}2$sq))" }).mkString(" && ")
 Resultant Exp : res28: String = (join_df1("colA1") === join_df1("colA2")) && (join_df1("colB1") === join_df1("colB2")) && (join_df1("colC1") === join_df1("colC2"))

现在,当我尝试将其替换为数据帧时,它会抛出一个错误。  join_df1.filter($ EXP)

我不确定我是否正确行事。我需要找到一种方法来替换我的表达并过滤掉值。  任何帮助表示赞赏。

enter image description here提前致谢

1 个答案:

答案 0 :(得分:1)

这不是有效的SQL。尝试:

val df = Seq(
  ("a", "a", "b", "b", "c", "c"),
  ("a", "A", "b", "B", "c", "C")).toDF("a1", "a2", "b1", "b2", "c1", "c2")

val filterCols = Seq("A", "B", "C")

val exp = filterCols.map(x => s"${x}1 = ${x}2").mkString(" AND ")
df.where(exp)