我要实现的只是:图像1因此,在这里您可以在第一个图像中看到,我有数据框架,其中前4行具有正确的哈希值存储在相应的列中(" col_1_hash"的哈希值为" col_1",而" col_2_hash"的哈希值为" col_2")。在第5行中,两者都具有werng hash值(col_1:a,col_2:z,z,col_1_hash:具有" z"的哈希值,col_2_hash:具有哈希值为" a"),第6行具有一个权利和一个werng值(col_1:col_1:col_1:D,col_2:w,col_1_hash:具有" d"(正确)的哈希值,col_2_hash:具有" z"(错误)的哈希值)
val totallytemp = xtranwedf.filter(( sha2($"col_1",256) =!= $"col_1_hash") ||
(sha2($"col_2",256) =!= $"col_2_hash"))
val total = totallytemp.count
这将给出输出:
total: Long = 2
上面的结果是我想通过foldleft实现的目标。由于有两个记录,那里有两个记录。
现在在这里我知道实现这一目标的简单方法,但这只是我不想通过硬编码的值。
因此,我正在在数据框架上进行收集,并从中获取值列表,并从中获得构成映射。您将在第二张图像中看到。图2因此,在这里,我通过地图并创建了累加器,但没有给出答案。正如您将在图像1答案中看到的那样,我想要的是2,但该代码给出了答案6。
val templist = "col_1" :: "col_2" :: Nil
val tempmapingList = Map(templist map {s => (s, s + "_hash")} : _*)
val expr: Column = tempmapingList.foldLeft(lit(false))
{
case (acc, (c, h)) => acc or (sha2(col(c), 256) =!= h)
}
xtranwedf.filter(expr).count
这给出输出:
total: Long = 6
我希望在这里是2。但是我认为它与===或=符号有关的位置与我无法执行的新列有关。
您的foldLeft
应用程序的问题是它不等于您要使用的表达式。
正如您所说的,您正在寻找
sha2(b, 256) = b_hash OR sha2(c, 256) = c_hash OR sha2(d, 256) = d_hash
虽然DataFrame
上的链式过滤器导致
sha2(b, 256) = b_hash AND sha2(c, 256) = c_hash AND sha2(d, 256) = d_hash
要实现前一个,您应该更改累加器:
import org.apache.spark.sql.functions.{col, lit}
import org.apache.spark.sql.Column
val atLeastOneMatch: Column = map.foldLeft(lit(false)) {
case (acc, (c, h)) => acc or (sha2(col(c), 256) === h)
}
然后使用结果过滤数据
df.filter(atLeastOneMatch).count
这将计算所有行,其中至少一列与map
提供的哈希匹配。根据de Morgan的法律,其否定
!atLeastOneMatch
将等效于
sha2(b, 256) != b_hash AND sha2(c, 256) != c_hash AND sha2(d, 256) = d_hash
换句话说,它将与非值匹配相应哈希的情况匹配。
如果您想找到至少一个值的行与哈希不匹配的行,则应使用
sha2(b, 256) != b_hash OR sha2(c, 256) != c_hash OR sha2(d, 256) != d_hash
可以组成如下所示
val atLeastOneMismatch: Column = map.foldLeft(lit(false)) {
case (acc, (c, h)) => acc or (sha2(col(c), 256) =!= h)
}
是否定
!atLeastOneMismatch
是等效的(再次摩根的定律)
sha2(b, 256) = b_hash AND sha2(c, 256) = c_hash AND sha2(d, 256) = d_hash
,用DataFrame
累加器和===
。
foldLeft
因此,总结 - 如果C
是一组列,则:
- ∃C∈C映射(C)= SHA2(C,256) -
atLeastOneMatch
- ∀C∈C映射(C)!= SHA2(C,256) -
!atLeastOneMatch
- ∃C∈C映射(C)!= SHA2(C,256) -
atLeastOneMismatch
- ∀C∈C映射(C)= SHA2(C,256) -
!atLeastOneMismatch