使用hash mod对数据帧进行采样

时间:2016-07-21 11:54:14

标签: hadoop apache-spark apache-spark-sql

我有一个带有字段transactionId的数据框,我想对此进行采样 领域。我想在字段的散列上进行采样,因为采样数据将连接到另一个采样数据帧的样本,我想在两个样本中都有相同的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)
                              ^

`

任何人都可以给我一些建议

1 个答案:

答案 0 :(得分:0)

这有两个不同的原因:

  • 您对列对象的哈希值不是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而不是哈希码。