2016-10-19 2 views
2

내가이pyspark SQL의 float 정밀도 오류

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

같은 테이블 내가 각 행의 비율을 생성 할하지만 비율 열을 요약하면 내가 여기에 100 % 을 얻을 수있는 코드의 I입니다 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| 
    +----------------+ 

N과 같은 결과를 얻었다 ot 100 %,이 정밀도 오류를 처리하는 방법? 감사합니다.

답변

2

두 번째 매개 변수를 1으로 변경하면 정밀도 오류가 사라집니다. 안타깝게도 123이 (가) 나눌 수있는 최상의 숫자가 아니며 정확도를 높이면 오류가 증가합니다.