web-dev-qa-db-ja.com

マッピングSpark DataSet行の値を新しいハッシュ列にマッピングする

次のDataSet値をinputDataとすると、

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

Sparkでは、新しいhash列を計算し、それを新しいDataSethashedDataに追加する効率的な方法は何ですか。ここで、hashは次のように定義されていますinputDataの各行の値に対するMurmurHash3の適用。

具体的には、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))

詳細が必要な場合はお知らせください。

どんな助けでもありがたいです。ありがとう!

9
Jesús Zazueta

1つの方法は、withColumn関数を使用することです。

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

Sparkは、これをパッケージorg.Apache.spark.sql.functions内のhash関数として実装済みです。

/**
 * 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 :(。

他の誰かがそれを必要とする場合に備えて、これをここに残します。ありがとう!

4
Jesús Zazueta