1

J'ai un dataframe (input_dataframe), qui ressemble comme ci-dessous:Vérifier si une colonne a bon nombre décimal

id  test_column 
1   0.25 
2   1.1 
3   12 
4   test 
5   1.3334 
6   .11 

Je veux ajouter un résultat colonne , qui a mis les valeurs si test_column a une valeur décimale et 0 si test_column a une autre valeur. Le type de données test_column est une chaîne. Ci-dessous le résultat attendu:

id  test_column  result 
1   0.25    1 
2   1.1    1 
3   12    0 
4   test    0 
5   1.3334   1 
6   .11    1 

Peut-on y parvenir en utilisant le code pySpark?

Répondre

1

Vous pouvez analyser jeton décimal avec decimal.Decimal()

Ici, nous le code dans à lier une UDF puis en utilisant df.withColumn

import decimal 
from pyspark.sql.types import IntType 

def is_valid_decimal(s): 
    try: 
     # return (0 if decimal.Decimal(val) == int(decimal.Decimal(val)) else 1)    
     return (0 if decimal.Decimal(val)._isinteger() else 1) 
    except decimal.InvalidOperation: 
     return 0 

# register the UDF for usage 
sqlContext.udf.register("is_valid_decimal", is_valid_decimal, IntType()) 

# Using the UDF 
df.withColumn("result", is_valid_decimal("test_column")) 
+0

cette solution ne fonctionne pas pour la valeur decimal.Decimal ("12"), il devrait retourner 0 dans de tels cas. –

+0

Ohh. Je n'ai pas vérifié ça !! J'ai mis à jour la réponse maintenant. @rajatsaxena – mrsrinivas

+0

Son parfaitement correspondant au scénario mentionné ci-dessus, je voulais juste vérifier si nous pouvons avoir une solution pour la valeur 12,0, dans ce cas, il doit être considéré comme décimal, mais la solution actuelle ne le reconnaît pas comme décimal. –