将Spark DataSet行值映射到新的哈希列

时间:2017-11-06 22:00:03

标签: scala apache-spark spark-dataframe apache-spark-dataset

将以下DataSet值视为inputData

column0 column1 column2 column3
A       88      text    99
Z       12      test    200
T       120     foo     12

在Spark中,计算新hash列的有效方法是什么,并将其附加到新DataSethashedData,其中hash定义为在MurmurHash3的每个行值上应用inputData

具体而言,hashedData为:

column0 column1 column2 column3 hash
A       88      text    99      MurmurHash3.arrayHash(Array("A", 88, "text", 99))
Z       12      test    200     MurmurHash3.arrayHash(Array("Z", 12, "test", 200))
T       120     foo     12      MurmurHash3.arrayHash(Array("T", 120, "foo", 12))

如果有必要提供更具体的信息,请与我们联系。

感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:7)

一种方法是使用withColumn函数:

import org.apache.spark.sql.functions.hash
dataset.withColumn("hash", hash(dataset.columns.map(col):_*))

答案 1 :(得分:3)

事实证明Spark已将此实现为包hash内的org.apache.spark.sql.functions函数

/**
 * Calculates the hash code of given columns, and returns the result as an int column.
 *
 * @group misc_funcs
 * @since 2.0
 */
@scala.annotation.varargs
def hash(cols: Column*): Column = withExpr {
  new Murmur3Hash(cols.map(_.expr))
}

就我而言,应用为:

import org.apache.spark.sql.functions.{col, hash}

val newDs = typedRows.withColumn("hash", hash(typedRows.columns.map(col): _*))

我真的有很多东西要学习Spark sql :(。

将此留在这里以防其他人需要它。谢谢!