pyspark sql ошибка точности с плавающей точкой

У меня есть такой стол

   +------+------------+
   | fruit|fruit_number|
   +------+------------+
   | apple|          20|
   |orange|          33|
   |  pear|          27|
   | melon|          31|
   |  plum|           8|
   |banana|           4|
   +------+------------+

Я хочу сгенерировать процент каждой строки, но когда я суммирую процентную колонку, я не смог получить 100%. Вот код, который я генерирую в pyspark.

    from pyspark import SparkConf, SparkContext
    from pyspark.sql import SQLContext, HiveContext,Row
    sqlContext = HiveContext(sc)
    from pyspark.sql.types import StringType, IntegerType,       StructType, StructField,LongType
    from pyspark.sql.functions import sum, mean,col


    rdd = sc.parallelize([('apple', 20),
    ('orange',33),
    ('pear',27),
    ('melon',31),
    ('plum',8),
    ('banana',4)])
    schema = StructType([StructField('fruit', StringType(), True),
                 StructField('fruit_number', IntegerType(),True)])
    df = sqlContext.createDataFrame(rdd, schema)
    df.registerTempTable('fruit_df_sql')

    #total_num = 123
    df_percent=spark.sql("""select fruit, round(fruit_number/123*100,2) as cnt_percent 
         from fruit_df_sql
         order by cnt_percent desc """)

     df_percent.agg(sum('cnt_percent')).show()

но я получил такой результат

     +----------------+
     |sum(cnt_percent)|
     +----------------+
     |           99.99|
     +----------------+

не 100%, как справиться с этой ошибкой точности? Спасибо

1 ответ

+ Изменить round второй параметр 1 и ошибка точности исчезнет. К несчастью, 123 это не лучшее число для деления, и с увеличением точности вы увеличите свою ошибку.

Другие вопросы по тегам