每当我尝试在 PySpark 中将字符串转换为 DecimalType 时返回空值

Posted

技术标签:

【中文标题】每当我尝试在 PySpark 中将字符串转换为 DecimalType 时返回空值【英文标题】:Null value returned whenever I try and cast string to DecimalType in PySpark 【发布时间】:2018-12-31 20:05:14 【问题描述】:

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

问题: 当我尝试使用 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 ***").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(将 everything 变为 null),使用各种类型(DecimalType、FloatType 等),然后将 inferSchema 从 true 更改为 false再回来,当然,铸造它。很确定这不应该那么困难 - 那么我在哪里犯了错误?

【问题讨论】:

【参考方案1】:

我认为逗号造成了麻烦。加载数据raw_df后,可以替换,的数量:

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

【讨论】:

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

以上是关于每当我尝试在 PySpark 中将字符串转换为 DecimalType 时返回空值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PySpark 中将字符串转换为字典 (JSON) 的 ArrayType

如何在pyspark中将字符串列转换为ArrayType

在 Pyspark 中将结构转换为数组

在pyspark中将字符串价格值转换为double类型

在 pyspark SQL 中将字符串日期转换为日期格式

如何在pyspark中将字符串值转换为arrayType