web-dev-qa-db-fra.com

Application de la fonction à Spark Colonne Dataframe

Venant de R, j'ai l'habitude de faire facilement des opérations sur des colonnes. Existe-t-il un moyen facile de prendre cette fonction que j'ai écrite en scala

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

Et appliquez-le à une colonne d'une trame de données - genre de ce que j'espérais que cela ferait:

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

Je n'ai pas trouvé de moyen facile et j'ai du mal à trouver comment le faire. Il doit y avoir un moyen plus simple que de convertir la trame de données en RDD, puis de sélectionner à partir du rdd de lignes pour obtenir le bon champ et de mapper la fonction sur toutes les valeurs, oui? Et aussi quelque chose de plus succinct en créant une table SQL et en faisant cela avec un UDF sparkSQL?

9
Michael Discenza

Vous pouvez définir un UDF comme suit:

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

bien que intégré Round expression utilise exactement la même logique que votre fonction et devrait être plus que suffisant, sans parler de beaucoup plus efficace:

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

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

Voir également:

16
zero323