web-dev-qa-db-fra.com

Problème avec la fonction ronde Pyspark

J'ai du mal à faire fonctionner la fonction round dans pyspark - J'ai le bloc de code ci-dessous, où j'essaie d'arrondir la colonne new_bid À 2 décimales et de renommer la colonne en bid après - j'importe pyspark.sql.functions AS func pour référence et j'utilise la fonction round qu'elle contient:

output = output.select(col("ad").alias("ad_id"),
                       col("part").alias("part_id"),
                       func.round(col("new_bid"), 2).alias("bid"))

la colonne new_bid ici est de type float - la trame de données résultante n'a pas la colonne bid nouvellement nommée arrondie à 2 décimales comme j'essaie de le faire, mais elle est toujours à 8 ou 9 décimales place.

J'ai essayé diverses choses, mais je n'arrive pas à obtenir la trame de données résultante pour avoir la valeur arrondie - tous les pointeurs seraient grandement appréciés! Merci!

7
dave

Voici quelques façons de le faire avec des données sur les jouets:

spark.version
# u'2.2.0'

import pyspark.sql.functions as func

df = spark.createDataFrame(
        [(0.0, 0.2, 3.45631),
         (0.4, 1.4, 2.82945),
         (0.5, 1.9, 7.76261),
         (0.6, 0.9, 2.76790),
         (1.2, 1.0, 9.87984)],
         ["col1", "col2", "col3"])

df.show()
# +----+----+-------+ 
# |col1|col2|   col3|
# +----+----+-------+
# | 0.0| 0.2|3.45631| 
# | 0.4| 1.4|2.82945|
# | 0.5| 1.9|7.76261| 
# | 0.6| 0.9| 2.7679| 
# | 1.2| 1.0|9.87984| 
# +----+----+-------+

# round 'col3' in a new column:
df2 = df.withColumn("col4", func.round(df["col3"], 2)).withColumnRenamed("col4","new_col3")
df2.show()
# +----+----+-------+--------+ 
# |col1|col2|   col3|new_col3|
# +----+----+-------+--------+
# | 0.0| 0.2|3.45631|    3.46|
# | 0.4| 1.4|2.82945|    2.83|
# | 0.5| 1.9|7.76261|    7.76|
# | 0.6| 0.9| 2.7679|    2.77|
# | 1.2| 1.0|9.87984|    9.88|
# +----+----+-------+--------+

# round & replace existing 'col3':
df3 = df.withColumn("col3", func.round(df["col3"], 2))
df3.show()
# +----+----+----+ 
# |col1|col2|col3| 
# +----+----+----+ 
# | 0.0| 0.2|3.46| 
# | 0.4| 1.4|2.83| 
# | 0.5| 1.9|7.76| 
# | 0.6| 0.9|2.77| 
# | 1.2| 1.0|9.88| 
# +----+----+----+ 

C'est un goût personnel, mais je ne suis pas un grand fan de ni col ni alias - je préfère withColumn et withColumnRenamed à la place. Néanmoins, si vous souhaitez vous en tenir à select et col, voici comment vous devez adapter votre propre extrait de code:

from pyspark.sql.functions import col

df4 = df.select(col("col1").alias("new_col1"), 
                col("col2").alias("new_col2"), 
                func.round(df["col3"],2).alias("new_col3"))
df4.show()
# +--------+--------+--------+ 
# |new_col1|new_col2|new_col3| 
# +--------+--------+--------+
# |     0.0|     0.2|    3.46|
# |     0.4|     1.4|    2.83|
# |     0.5|     1.9|    7.76|
# |     0.6|     0.9|    2.77|
# |     1.2|     1.0|    9.88|
# +--------+--------+--------+

PS C'est toujours une bonne idée de fournir quelques exemples de données et un résultat souhaité avec votre question, ainsi que toutes les importations pertinentes - voir Comment puis-je poser une bonne question? .

14
desertnaut