使用hash mod对Dataframe进行采样

f3temu5u  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(368)

我有一个带有字段transactionid的Dataframe,我想在这个字段上取样。我想对字段的散列进行采样,因为采样的数据将连接到另一个采样的Dataframe的样本,并且我希望在两个样本中具有相同的id。问题是我已经尝试过各种版本的过滤器,我一直在研究如何在过滤器中散列和修改

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)
                              ^

`
有人能给我一些建议吗

piztneat

piztneat1#

这是不正确的,原因有两个:
可以获取列对象的哈希值,而不是 DataFrame ,
您使用了错误的相等运算符。
正确的解决方案如下:

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 不是散列码。

相关问题