Trouble With Pyspark Round Function

前端 未结 1 1648
南笙
南笙 2020-12-16 15:33

Having some trouble getting the round function in pyspark to work - I have the below block of code, where I\'m trying to round the new_bid column to 2 decimal p

相关标签:
1条回答
  • 2020-12-16 16:23

    Here are a couple of ways to do it with some toy data:

    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| 
    # +----+----+----+ 
    

    It's a personal taste, but I am not a great fan of either col or alias - I prefer withColumn and withColumnRenamed instead. Nevertheless, if you would like to stick with select and col, here is how you should adapt your own code snippet:

    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 It is always a good idea to provide some sample data and a desired outcome with your question, as well as any relevant imports - see How do I ask a good question?.

    0 讨论(0)
提交回复
热议问题