Преобразование столбца фрейма данных pyspark с не круглой функцией (pyspark) - PullRequest
0 голосов
/ 09 июля 2019

Я хочу создать новый столбец фрейма данных искры с округленными значениями уже существующего столбца. Столбец «em» имеет тип float.

Я уже проверил различные сообщения, но не мог понять это. Включая следующую ссылку: Проблема с функцией Pyspark Round

Вот мой код:

import pyspark.sql.functions as f
df = df.withColumn("rounded", f.round(f.col("em"), 3))
df.show()

Вновь созданный столбец «закругленный» в точности совпадает с исходным столбцом «em». Я работаю с pyspark версии 2.3.0 в Zeppelin Notebook на кластере Cloudera.

UPDATE:

Попробовал следующее:

%pyspark
s2_em = s2.select('em')
print "Datatype:", type(s2_em)
s2_em.printSchema()
s2_em = s2_em.withColumn('rounded', f.round(f.col('em'), 3))
s2_em = s2_em.withColumn('plus', f.col('em') + f.col('rounded'))
s2_em = s2_em.withColumn('minus', f.col('em') - f.col('rounded'))
s2_em = s2_em.withColumn('multiplication', f.col('em') * f.col('rounded'))
s2_em.limit(5).show()

Это дает следующее, но округление все еще не работает. Любые другие подсказки?:

Datatype: <class 'pyspark.sql.dataframe.DataFrame'>
root |-- em: float (nullable = true)
+------------+------------+------------+-----+--------------+
|          em|     rounded|        plus|minus|multiplication|
+------------+------------+------------+-----+--------------+
|1.14209626E9|1.14209626E9|2.28419251E9| 0.0|   1.3043839E18|
|1.25046528E9|1.25046528E9|2.50093056E9| 0.0|  1.56366345E18|
| 9.5720672E8| 9.5720672E8|1.91441344E9| 0.0|   9.1624469E17|
| 1.1392649E9| 1.1392649E9|2.27852979E9| 0.0|  1.29792455E18|
|1.29539699E9|1.29539699E9|2.59079398E9| 0.0|  1.67805334E18|
+------------+------------+------------+-----+--------------+

1 Ответ

1 голос
/ 09 июля 2019

Провел тест с тем же кодом, и он отлично работает, см. Пример ниже:

import pyspark.sql.functions as f
from pyspark import Row
from pyspark.shell import spark

df = spark.createDataFrame([
    Row(em=3.45631),
    Row(em=2.82945),
    Row(em=7.76261),
    Row(em=2.76790)
])

df = df.withColumn('rounded', f.round(f.col('em'), 3))
df.show()

Выход:

+-------+-------+                                                               
|     em|rounded|
+-------+-------+
|3.45631|  3.456|
|2.82945|  2.829|
|7.76261|  7.763|
| 2.7679|  2.768|
+-------+-------+

UPDATE

Фактически, его плавающие значения содержат показатели E9 и E8. Например, значение 1.14209626E9 равно 1142096260.

Чтобы округлить их, необходимо разделить значение на 1e9, а затем вызвать функцию round.

См. Пример ниже:

import pyspark.sql.functions as f
from pyspark import Row
from pyspark.shell import spark

df = spark.createDataFrame([
    Row(em=1.14209626E9),
    Row(em=1.25046528E9),
    Row(em=9.5720672E8)
])

df = df.withColumn('rounded', (f.round(f.col('em') / 1e9, 3)) * 1e9)
df.show()

Выход:

+------------+-------+
|          em|rounded|
+------------+-------+
|1.14209626E9|1.142E9|
|1.25046528E9| 1.25E9|
| 9.5720672E8| 9.57E8|
+------------+-------+
...