Scala Spark DataFrame列作为映射,并使用foldleft进行比较



我要实现的只是:图像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

相关内容

  • 没有找到相关文章

最新更新