每当我尝试在 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 时返回空值的主要内容,如果未能解决你的问题,请参考以下文章