Étant donné les valeurs DataSet
suivantes comme inputData
:
column0 column1 column2 column3
A 88 text 99
Z 12 test 200
T 120 foo 12
Dans Spark, quel est un moyen efficace de calculer une nouvelle colonne hash
et de l'ajouter à une nouvelle DataSet
, hashedData
, où hash
est défini comme l'application de MurmurHash3
sur chaque valeur de ligne de inputData
.
Plus précisément, hashedData
comme:
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))
Veuillez me faire savoir si des détails supplémentaires sont nécessaires.
Toute aide est appréciée. Merci!
Une façon consiste à utiliser la fonction withColumn
:
import org.Apache.spark.sql.functions.hash
dataset.withColumn("hash", hash(dataset.columns.map(col):_*))
Il s'avère que Spark a déjà cela implémenté comme fonction hash
dans le package 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))
}
Et dans mon cas, appliqué comme:
import org.Apache.spark.sql.functions.{col, hash}
val newDs = typedRows.withColumn("hash", hash(typedRows.columns.map(col): _*))
J'ai vraiment beaucoup à apprendre sur Spark sql :(.
Laissant cela ici au cas où quelqu'un d'autre en aurait besoin. Merci!