Pyspark字符串到十进制的转换,以及类似Java十进制格式化程序的精度和格式

2024-09-29 17:18:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将字符串转换为十进制。
我有时可能会收到如下十进制数据
1234.6789-(-结尾)
在java中,我可以指定如下格式来解析上面的内容,
DecimalFormat dfmt=新的DecimalFormat(“0000.0000;0000.0000-”)这样我得到的十进制值为-1234.6789

我们在Python或Pyspark中是否有与上述类似的版本

我创建了UDF

def getDecimalVal(myString):
    return Decimal(myString)
ConvertToDec = udf(getDecimalVal, DecimalType(4))

我在下面的代码中调用它

Employee = Row("firstName", "lastName", "email", "salary","salaryday")
employee1 = Employee('steve', 'mill', 'bash@elean.co', "0012.7590","2020-04-30")
employee2 = Employee( 'jack','neil', 'daniel@ssl.edu', "0013.2461","2020-04-30" )
employees=[employee1,employee2]
dframe = spark.createDataFrame(employees)
dframe=dframe.withColumn('decimalval',ConvertToDec(col('salary'))) 
dframe.show()

下面是输出

+---------+--------+--------------+---------+----------+---------+----------+
|firstName|lastName|         email|   salary| salaryday|finalname|decimalval|
+---------+--------+--------------+---------+----------+---------+----------+
|      len|armbrust| bash@learn.co|  0012.75|2020-04-30|      len|        13|
|      dem|    meng|daniel@uda.edu|0013.2461|2020-04-30|      dem|        13|
+---------+--------+--------------+---------+----------+---------+----------+

我有以下问题
1) 十进制值不是12.759013.2461而是四舍五入到13
2) 如果我将UDF中的进动改为分母类型(4,4),我得到以下误差

 Py4JJavaError: An error occurred while calling o2598.showString.
java.lang.IllegalArgumentException: requirement failed: Decimal precision 6 exceeds max precision 4

如何保持精度以及如何保持精度


Tags: emailemployeejavafirstnamedecimalsalarylastnamemystring
1条回答
网友
1楼 · 发布于 2024-09-29 17:18:58

您可以regexp_reaplace首先移动前面的-符号,然后cast移动到DecimalType。这样可以避免使用自定义项。像这样的方法应该会奏效:

from pyspark.sql.functions import regexp_replace
...
dframe = dframe.withColumn(
    'decimalval',
    regexp_replace('salary', r'([0-9\.]+)\-', '-$1').cast("DECIMAL(8,4)"))

请注意,如果十进制数中有8位数字,则应使用DecimalType(8, 4)而不是DecimalType(4, 4)。从pyspark文档here

precision – the maximum total number of digits (default: 10)

scale – the number of digits on right side of dot. (default: 0)

相关问题 更多 >

    热门问题