使用 PySpark 和 Babel 将浮点数格式化为货币
Format float to currency using PySpark and Babel
我想使用 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
列似乎有问题。从错误中可以明显看出 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
要将 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|
| US1.20| USD|
| €142.08| EUR|
|US,000,000.00| USD|
+----------------+--------+
我想使用 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
列似乎有问题。从错误中可以明显看出 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
要将 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|
| US1.20| USD|
| €142.08| EUR|
|US,000,000.00| USD|
+----------------+--------+