【问题标题】:Format float to currency using PySpark and Babel使用 PySpark 和 Babel 将浮点数格式化为货币
【发布时间】:2021-02-02 06:37:52
【问题描述】:

我想使用 Babel 和 PySpark 将 float 转换为 currency

样本数据:

amount       currency
2129.9       RON
1700         EUR
1268         GBP
741.2        USD
142.08091153 EUR
4.7E7        USD
0            GBP

我试过了:

df = df.withColumn(F.col('amount'), format_currency(F.col('amount'), F.col('currency'),locale='be_BE'))

df = df.withColumn(F.col('amount'), format_currency(F.col('amount'), 'EUR',locale='be_BE'))

他们都给我一个错误:

【问题讨论】:

  • 您能否提供amount列的样本数据,并且由于错误是由于十进制转换,所以您可以检查/在整个amount列中是否有任何/
  • 所以你是说整个amount列中除了numeric之外没有其他字符了?因为没有其他原因会出现decimal conversion 错误
  • 我检查了表格末尾列中有一个E,例如4.7E7
  • 删除这些字符并重试。还要检查行是否为numeric or integer,您可以使用df.select("amount",F.col("amount").cast("int").isNotNull().alias("Truth")).show()
  • 删除这些字符regexp_extract 的最佳方法是什么?

标签: apache-spark pyspark user-defined-functions currency-formatting python-babel


【解决方案1】:

要将 Python 库与 Spark 数据帧一起使用,您需要使用 UDF:

from babel.numbers import format_currency
import pyspark.sql.functions as F

format_currency_udf = F.udf(lambda a, c: format_currency(a, c))

df2 = df.withColumn(
    'amount',
    format_currency_udf('amount', 'currency')
)

df2.show()
+----------------+--------+
|          amount|currency|
+----------------+--------+
|     RON2,129.90|     RON|
|       €1,700.00|     EUR|
|       £1,268.00|     GBP|
|       US$741.20|     USD|
|         €142.08|     EUR|
|US$47,000,000.00|     USD|
+----------------+--------+

【讨论】:

  • 适用于大多数值,但仍有InvalidOperation: [<class 'decimalConversionSyntax'>] 错误。我检查了所有值,但找不到原因。我怎样才能最好地找到导致错误的值?有些值是0 这会导致问题吗?
  • @JohnDoe 它会因空值而失败。你可以在 udf 中添加一个检查来捕捉这个。
【解决方案2】:

预处理数据框的amount 列似乎存在问题。从错误中可以看出value 转换为字符串后不仅仅是数字,它必须根据此table 并且还有一些额外的字符。您可以检查此列以找到该问题并删除不必要的字符以解决此问题。例如:

>>> import decimal
>>> value = '10.0'
>>> value = decimal.Decimal(str(value))
>>> value
Decimal('10.0')
>>> value = '10.0e'
>>> value = decimal.Decimal(str(value))
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    value = decimal.Decimal(str(value))
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]   # as '10.0e' is not just numeric

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多