我有一个带有字段transactionId的数据帧,我想对此进行采样领域我想对字段的哈希进行采样,因为采样的数据将连接到另一个采样数据帧的样本,并且我想在两个样本中都有相同的id。问题是,我在尝试了各种版本的后,一直被困在如何在过滤器中进行哈希和mod上
scala> val dfSampled = df.filter($"transactionId".hashCode() % 10 == 0)
<console>:27: error: overloaded method value filter with alternatives:
(conditionExpr: String)org.apache.spark.sql.DataFrame <and>
(condition: org.apache.spark.sql.Column)org.apache.spark.sql.DataFrame
cannot be applied to (Boolean)
val dfSampled = df.filter($"transactionId".hashCode() % 10 == 0)
^
`
有人能给我一些建议吗
这是不正确的,原因有两个:
- 取列对象的散列而不是CCD_ 1中的值
- 您使用了不正确的相等运算符
正确的解决方案是这样的:
import org.apache.spark.sql.functions.hash
val df = sc.range(1L, 100L).toDF("transactionId").show
// +-------------+
// |transactionId|
// +-------------+
// | 4|
// | 16|
// | 18|
// | 26|
// | 27|
// +-------------+
df.filter(hash($"transactionId") % 10 === 0)
请注意,它使用的是Murmur3Hash
,而不是哈希代码。