Округлить двойные значения и привести к целым числам - PullRequest
0 голосов
/ 01 июня 2018

У меня есть фрейм данных в PySpark, как показано ниже.

import pyspark.sql.functions as func

df = sqlContext.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))
df2.show()

+----+----+-------+----+
|col1|col2|   col3|col4|
+----+----+-------+----+
| 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|
+----+----+-------+----+

В приведенном выше фрейме данных col4 равно double.Теперь я хочу преобразовать col4 как Integer

df2 = df.withColumn("col4", func.round(df["col3"], 2).cast('integer'))

+----+----+-------+----+
|col1|col2|   col3|col4|
+----+----+-------+----+
| 0.0| 0.2|3.45631|   3|
| 0.4| 1.4|2.82945|   2|
| 0.5| 1.9|7.76261|   7|
| 0.6| 0.9| 2.7679|   2|
| 1.2| 1.0|9.87984|   9|
+----+----+-------+----+

Но я хочу округлить значения col4 до ближайших

expected result

+----+----+-------+----+
|col1|col2|   col3|col4|
+----+----+-------+----+
| 0.0| 0.2|3.45631|   3|
| 0.4| 1.4|2.82945|   3|
| 0.5| 1.9|7.76261|   8|
| 0.6| 0.9| 2.7679|   3|
| 1.2| 1.0|9.87984|  10|
+----+----+-------+----+

Как я могу это сделать?

1 Ответ

0 голосов
/ 01 июня 2018

Вы должны использовать функцию round, а затем привести к целочисленному типу.Однако не используйте второй аргумент для функции round.При использовании 2 он округляется до 2 десятичных знаков, затем cast до целого числа округляется вниз до ближайшего числа.

Вместо этого используйте:

df2 = df.withColumn("col4", func.round(df["col3"]).cast('integer'))
...