Python 每当我尝试将字符串强制转换为PySpark中的DecimalType时返回Null值

Python 每当我尝试将字符串强制转换为PySpark中的DecimalType时返回Null值,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,已经有一段时间了,但我又回来了 问题: 当我尝试使用PySpark将StringType类型的任何列转换为DecimalType(和FloatType)时,返回的是空值。像F.substring这样的方法仍然在列上工作,因此它显然仍然被视为字符串,即使我正在尽我所能将它指向正确的方向 复制: 示例csv: Currency,Total USD,"3,472.43" 示例.py文件: from pyspark.sql import DataFrame, SparkSession, types,

已经有一段时间了,但我又回来了

问题: 当我尝试使用PySpark将StringType类型的任何列转换为DecimalType(和FloatType)时,返回的是空值。像
F.substring
这样的方法仍然在列上工作,因此它显然仍然被视为字符串,即使我正在尽我所能将它指向正确的方向

复制: 示例csv:

Currency,Total
USD,"3,472.43"
示例.py文件:

from pyspark.sql import DataFrame, SparkSession, types, functions as F
from pyspark.sql.types import StructField, StringType, DoubleType, TimestampType

def transform():
    spark = SparkSession.builder.appName(
        "Example for StackOverflow").enableHiveSupport().getOrCreate()

    raw_df = spark.read.csv('ex.csv', header=True)

    processed_df = \
        raw_df.withColumn('Amount2', F.col('Total').cast(types.DecimalType()))

    processed_df.show()

    processed_df = \
        raw_df.withColumn('Amount3',  F.substring(F.col('Total'), 0, 4))

    processed_df.show()

    processed_df = \
        raw_df.withColumn('Amount2', F.col('Total').cast(types.DecimalType()))

    processed_df.show()

transform()
运行时,给出以下输出:

+--------+--------+-------+
|Currency|   Total|Amount2|
+--------+--------+-------+
|     USD|3,472.43|   null|
+--------+--------+-------+

+--------+--------+-------+
|Currency|   Total|Amount3|
+--------+--------+-------+
|     USD|3,472.43|   3,47|
+--------+--------+-------+

+--------+--------+-------+
|Currency|   Total|Amount2|
+--------+--------+-------+
|     USD|3,472.43|   null|
+--------+--------+-------+
我真的不明白这里的电线在哪里交叉

尝试的解决方案
我已经尝试了我能想到的一切——使用
StructType
(它将所有内容都设置为null),使用各种类型(DecimalType、FloatType等),将inferSchema从true更改为false,然后再更改为false,当然,还可以强制转换它。很确定这应该不会那么困难——那么我在哪里犯了错误呢?

我认为逗号是造成问题的原因。加载数据
raw_df
后,您可以替换
,数量如下:

processed_df = raw_df.withColumn('Amount2', F.regex_replace('Total',',',''))

我不敢相信,但它奏效了。在假设Spark会用逗号推断出一个数量之前,应该先尝试一下。非常感谢你!