Pyspark : 반올림 또는 반올림하는 방법 (가장 가까운 값으로 반올림) [중복]

Aug 21 2020

다음과 같은 df 가 있습니다.

TEST_schema = StructType([StructField("date", StringType(), True),\
                          StructField("col1", FloatType(), True),\
                          ])
TEST_data = [('2020-08-01',1.22),('2020-08-02',1.15),('2020-08-03',5.4),('2020-08-04',2.6),('2020-08-05',3.5),\
             ('2020-08-06',2.2),('2020-08-07',2.7),('2020-08-08',-1.6),('2020-08-09',1.3)]
rdd3 = sc.parallelize(TEST_data)
TEST_df = sqlContext.createDataFrame(TEST_data, TEST_schema)
TEST_df = TEST_df.withColumn("date",to_date("date", 'yyyy-MM-dd'))
TEST_df.show() 

+----------+-----+
|      date|col1 |
+----------+-----+
|2020-08-01| 1.22|
|2020-08-02| 1.15|
|2020-08-03| 5.4 |
|2020-08-04| 2.6 |
|2020-08-05| 3.5 |
|2020-08-06| 2.2 |
|2020-08-07| 2.7 |
|2020-08-08|-1.6 |
|2020-08-09| 1.3 |
+----------+-----+

논리 : col1 을 가장 가까운 값으로 반올림 하고 integer , max (rounded value, 0)

결과 df는 다음과 같습니다.

+----------+----+----+
|      date|col1|want|
+----------+----+----+
|2020-08-01| 1.2|   1|
|2020-08-02| 1.1|   1|
|2020-08-03| 5.4|   5|
|2020-08-04| 2.6|   3|
|2020-08-05| 3.5|   4|
|2020-08-06| 2.2|   2|
|2020-08-07| 2.7|   3|
|2020-08-08|-1.6|   0|
|2020-08-09| 1.3|   1|
+----------+----+----+

답변

Lamanus Aug 22 2020 at 03:07

모든 것을 제공하는 중복 질문을 확인하십시오.

data = [('2020-08-01',1.22),('2020-08-02',1.15),('2020-08-03',5.4),('2020-08-04',2.6),('2020-08-05',3.5),('2020-08-06',2.2),('2020-08-07',2.7),('2020-08-08',-1.6),('2020-08-09',1.3)]
df = spark.createDataFrame(data, ['date', 'col1'])

df.withColumn('want', expr('ROUND(col1, 0)').cast('int')).show() 

+----------+----+----+
|      date|col1|want|
+----------+----+----+
|2020-08-01|1.22|   1|
|2020-08-02|1.15|   1|
|2020-08-03| 5.4|   5|
|2020-08-04| 2.6|   3|
|2020-08-05| 3.5|   4|
|2020-08-06| 2.2|   2|
|2020-08-07| 2.7|   3|
|2020-08-08|-1.6|  -2|
|2020-08-09| 1.3|   1|
+----------+----+----+
VITTALB Aug 22 2020 at 07:07

먼저 여기에서 0보다 작은 지 확인하고 있습니다. 여기서 우리는 pyspark 함수의 when 메소드를 사용하고 있습니다. 먼저 열의 값이 0보다 작은 지 확인하고, 0이되면 0이됩니다. 그렇지 않으면 열의 실제 값을 가져온 다음 pyspark.sql import에서 int로 캐스팅합니다. F로 기능

TEST_df.withColumn("want", F.bround(F.when(TEST_df["col1"] < 0, 0).otherwise(TEST_df["col1"])).cast("int")).show()
+----------+----+----+
|      date|col1|want|
+----------+----+----+
|2020-08-01|1.22|   1|
|2020-08-02|1.15|   1|
|2020-08-03| 5.4|   5|
|2020-08-04| 2.6|   3|
|2020-08-05| 3.5|   4|
|2020-08-06| 2.2|   2|
|2020-08-07| 2.7|   3|
|2020-08-08|-1.6|   0|
|2020-08-09| 1.3|   1|
+----------+----+----+