检查列是不是具有正确的十进制数

Posted

技术标签:

【中文标题】检查列是不是具有正确的十进制数【英文标题】:Checking whether a column has proper decimal number检查列是否具有正确的十进制数 【发布时间】:2017-10-06 05:16:19 【问题描述】:

我有一个数据框(input_dataframe),如下所示:

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

我想添加一列 result,如果 test_column 具有 十进制值,则输入值 1 并且0 如果 test_column 有任何其他值。 test_column 的数据类型是字符串。以下是预期的输出:

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

我们可以使用 pySpark 代码来实现吗?

【问题讨论】:

【参考方案1】:

您可以使用decimal.Decimal() 解析十进制标记

这里我们将代码绑定到 UDF 中,然后使用 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"))

【讨论】:

此解决方案不适用于十进制值。十进制(“12”),在这种情况下它应该返回 0。 哦。我没有检查!我现在更新了答案。 @rajatsaxena 它与上述场景完美匹配,只是想检查我们是否可以找到值 12.0 的解决方案,在这种情况下,它应该被视为十进制,但当前的解决方案无法将其识别为十进制。 @mrsrinivas 这看起来不适合我,我收到AttributeError: 'decimal.Decimal' object has no attribute '_isinteger' 你使用的是哪个版本的 pyspark 以及哪个 python 版本,我使用的是最新的 spark2.2 和 python3.6.3 版本。 python版本为2.7.2

以上是关于检查列是不是具有正确的十进制数的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是是十六进制数的有效表示

一个热编码列表列,包括附加置信度十进制数

正则表达式带逗号的十进制数

将n进制数转换为m进制,但程序不正确。。

如何使用带有 python 3 的十进制数/数据检查相关性

Javascript如何将十进制数转换为具有特定小数位数的字符串