web-dev-qa-db-ja.com

Spark Dataframe Columnへの関数の適用

Rから来て、私は列の操作を簡単に行うことに慣れています。 scalaで書いたこの関数を使用する簡単な方法はありますか

def round_tenths_place( un_rounded:Double ) : Double = {
    val rounded = BigDecimal(un_rounded).setScale(1, BigDecimal.RoundingMode.HALF_UP).toDouble
    return rounded
}

そして、それをデータフレームの1列に適用します-私はこれが何をしたいのですか?

 bid_results.withColumn("bid_price_bucket", round_tenths_place(bid_results("bid_price")) )

簡単な方法を見つけることができず、これを行う方法を見つけるのに苦労しています。データフレームをRDDに変換し、RDDの行から選択して適切なフィールドを取得し、すべての値に関数をマッピングするよりも簡単な方法が必要です。また、SQLテーブルをより簡潔に作成し、sparkSQL UDFでこれを行うこともできますか?

9

UDFは次のように定義できます。

val round_tenths_place_udf = udf(round_tenths_place _)
bid_results.withColumn(
  "bid_price_bucket", val round_tenths_place_udf($"bid_price"))

ただし、組み込みの Round expression は関数とまったく同じロジックを使用しており、十分に効率的であることは言うまでもありません。

import org.Apache.spark.sql.functions.round

bid_results.withColumn("bid_price_bucket", round($"bid_price", 1))

こちらもご覧ください:

16
zero323