функция round () не работает для databricks-Python - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь использовать функцию round () в кирпичах данных, чтобы округлить некоторые значения с плавающей запятой до 2 цифр. Однако Python для блоков данных не работает как обычный Python.

Пожалуйста, помогите мне с причинами и решениями, если таковые имеются.

lis = [-12.1334, 12.23433, 1.2343, -104.444]
lis2 = [round(val,2)  for val in lis]
print(lis2)

TypeError: Invalid argument, not a string or column: -12.1334 of type <type 'float'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.

Изображение, подтверждающее код

Ответы [ 3 ]

0 голосов
/ 26 апреля 2019

Я полагаю, что это исходный код для функции, которую вы применяете:

def round(col, scale=0):
    """
    Round the given value to `scale` decimal places using HALF_UP rounding mode if `scale` >= 0
    or at integral part when `scale` < 0.

    >>> spark.createDataFrame([(2.5,)], ['a']).select(round('a', 0).alias('r')).collect()
    [Row(r=3.0)]
    """
    sc = SparkContext._active_spark_context
    return Column(sc._jvm.functions.round(_to_java_column(col), scale))

Ясно, что в нем говорится, что передается столбец, а не десятичное число.Вы импортировали *?Это могло бы переопределить встроенную функцию.

0 голосов
/ 26 апреля 2019

Воспроизводится только при импорте функции спарка из модуля function в spark.sql

Для функции круглого искрения требуется строка или столбец. Что объясняет ошибку.

Вы можете использовать псевдоним импорта, например import pyspark.sql.functions as F вместо from pyspark.sql.functions import *

Таким способом вы можете получить метод round origin.

import builtins
round = getattr(builtins, "round")

И тогда вы можете выполнить

lis = [-12.1334, 12.23433, 1.2343, -104.444]
lis2 = [round(val,2)  for val in lis]
print(lis2)
0 голосов
/ 26 апреля 2019

Попробуйте это:

lis = [-12.1334, 12.23433, 1.2343, -104.444]
list_em = []
for row in lis:
    list_em.append(round(row,2))
print(list_em)

[-12.13, 12.23, 1.23, -104.44]
...