Python 每当我尝试将字符串强制转换为PySpark中的DecimalType时返回Null值
已经有一段时间了,但我又回来了 问题: 当我尝试使用PySpark将StringType类型的任何列转换为DecimalType(和FloatType)时,返回的是空值。像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,
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会用逗号推断出一个数量之前,应该先尝试一下。非常感谢你!