Pyspark 字符串到十进制的转换,以及像Java十进制格式器一样的精度和格式。

问题描述 投票:0回答:1

我正在尝试将字符串转换为十进制数据。有时我可能会收到如下的十进制数据 1234.6789- (-在最后)在java中,我可以指定如下格式来解析上面的内容。DecimalFormat dfmt = new 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', '[email protected]', "0012.7590","2020-04-30")
employee2 = Employee( 'jack','neil', '[email protected]', "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| [email protected]|  0012.75|2020-04-30|      len|        13|
|      dem|    meng|[email protected]|0013.2461|2020-04-30|      dem|        13|
+---------+--------+--------------+---------+----------+---------+----------+

我有以下问题 1)小数点的数值不是小数点,而是小数点。12.759013.2461 正在轮到 13 2) 如果我将UDF中的precession改为DecimalType(4,4),我得到以下错误信息。

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

如何留住精准,如何留住精准?

python pyspark decimal user-defined-functions
1个回答
1
投票

你可以 regexp_reaplace 先动 - 挡在前面,然后 castDecimalType. 这样你就可以避免使用UDF。像这样的东西应该可以用。

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文档中 此处

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

scale – the number of digits on right side of dot. (default: 0)
© www.soinside.com 2019 - 2024. All rights reserved.