PySpark SQL TRY_CAST?

时间:2018-12-07 10:11:46

标签: apache-spark pyspark pyspark-sql

我在一个Dataframe中有数据,所有列都是字符串。现在,列中的某些数据是数字的,因此我可以强制转换为浮点型。其他行实际上包含我不想投射的字符串。

所以我一直在寻找try_cast之类的东西,并且已经尝试在.when().otherwise()上构建东西,但到目前为止没有成功。

casted = data.select(when(col("Value").cast("float").isNotNull(), col("Value").cast("float")).otherwise(col("Value")))

这是行不通的,它永远都不会结束。

像这样的事情是否通常可行(以一种没有UDF等的高性能方式)?

1 个答案:

答案 0 :(得分:0)

您不能在Spark中使用两种类型的列:float或string。这就是为什么您的列始终为string类型的原因(因为它可以同时包含:字符串和浮点数)。

您的代码的作用是:如果Value列中的数字不适合float,则将其强制转换为float,然后转换为字符串(尝试使用> 6个小数位)。据我所知TRY_CAST转换为value或null(至少在SQL Server中),所以这正是spark的cast所做的。