web-dev-qa-db-fra.com

Mappage Spark DataSet row values ​​in new hash column

É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!

9
Jesús Zazueta

Une façon consiste à utiliser la fonction withColumn:

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

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!

4
Jesús Zazueta