1
votes

La fonction round () ne fonctionne pas pour databricks-Python

J'essaye d'utiliser la fonction round () dans les databricks pour arrondir certaines valeurs flottantes à 2 chiffres. Cependant, le python databricks ne fonctionne pas comme le python normal.

S'il vous plaît, aidez-moi avec les raisons et les solutions le cas échéant.

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.
lis = [-12.1334, 12.23433, 1.2343, -104.444]
lis2 = [round(val,2)  for val in lis]
print(lis2)

Preuve de code d'image


5 commentaires

Ce code ne produit pas l'erreur revendiquée. Veuillez poster votre vrai code.


Impossible de recréer l'erreur non plus


preuve d'image ajoutée pour plus de commodité


En outre, le code doit être exécuté dans un bloc-notes databricks par opposition à la manière normale de python. La méthode python normale fonctionnera sans aucune erreur. Le problème concerne le python basé sur les databricks.


Cela vous a-t-il aidé?


4 Réponses :


0
votes

Essayez ceci:

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]


2 commentaires

Cela n'explique pas du tout le problème. Le code OP publié n'a même pas de problème reproductible.


Cela ne fonctionne pas non plus. Lorsque je lance dans le bloc-notes databricks, la fonction round ne fonctionne pas. Vous pouvez vérifier la preuve d'image ci-jointe.



0
votes

Je crois que c'est le code source de la fonction que vous appliquez:

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))

Il est clairement indiqué de passer dans une colonne, pas dans un nombre décimal. Avez-vous importé *? Cela aurait pu remplacer la fonction intégrée.


1 commentaires

Oui. J'ai supprimé toute l'importation de trucs d'étincelles. Maintenant ça marche. C'était un problème de remplacement de la fonction ronde. Merci.



3
votes

Ceci n'est reproductible que lorsque vous importez la fonction spark round du module function dans spark.sql

La fonction spark round nécessite une chaîne ou une colonne. Ce qui explique l'erreur.

Vous pouvez soit aliaser l'importation comme import pyspark.sql.functions comme F au lieu de à partir de pyspark.sql.functions import * code>

Vous pouvez obtenir la méthode d'origine round de cette façon.

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

Et ensuite vous pouvez exécuter

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


1 commentaires

A travaillé comme un charme! Merci.



1
votes

Bonjour, La question est probablement liée à un conflit d'espace de nom. J'ai couru quelque chose comme

import pyspark.sql.functions as F
lis = [-12.1334, 12.23433, 1.2343, -104.444]
lis2 = [round(val,2)  for val in lis]
print(lis2)

[-12.13, 12.23, 1.23, -104.44]

qui contient la fonction round . Vous pouvez facilement voir quel cycle est utilisé en exécutant l'aide dessus:

help(round)

Une solution simple pour cela consiste à désigner la fonction pyspark dans un espace de nom différent.

XXX


0 commentaires