如果我将列转换为其他类型,那么任何无法转换的数据都会以静默方式转换为NULL:
df = sc.parallelize([('a', '1'), ('b', 'NAN'), ('c', 'foo'))]) .toDF(['name', 'values'])
df.select( df.values.cast(DoubleType()) ).show()
+------+
|values|
+------+
| 1.0|
| null|
| null|
+------+
如果无法转换任何值,有没有办法让转换产生错误?
答案 0 :(得分:0)
您可以使用python的udf
函数为此编写自己的float
,当字符串无法转换为float时会引发错误:
import pyspark.sql.functions as F
@F.udf
def cast_safe(x):
return float(x)
df.select(cast_safe(df.values).alias("values")).show()
[第5阶段:> (0 + 3)/ 3] 17/09/29 09:00:29错误执行者:任务2.0中的异常 第5.0阶段(TID 11) org.apache.spark.api.python.PythonException:Traceback(最近一次调用最后一次): 文件“C:\ spark \ spark-2.0.1 \ python \ lib \ pyspark.zip \ pyspark \ worker.py”,行 172,主要 文件“C:\ spark \ spark-2.0.1 \ python \ lib \ pyspark.zip \ pyspark \ worker.py”,行 167,正在进行中 文件“C:\ spark \ spark-2.0.1 \ python \ lib \ pyspark.zip \ pyspark \ worker.py”,行 106,in 文件“C:\ spark \ spark-2.0.1 \ python \ lib \ pyspark.zip \ pyspark \ worker.py”,行 92,在 文件“C:\ spark \ spark-2.0.1 \ python \ lib \ pyspark.zip \ pyspark \ worker.py”,行 70,在 文件“”,第3行,在cast_safe中 ValueError:无法将字符串转换为float:foo
如果列中的所有元素都可以安全地投放,则可以正常工作:
df1 = sc.parallelize([('a', '1'), ('b', '0'), ('c', '2.')]) .toDF(['name', 'values'])
df1.select(df1.name, cast_safe(df1.values).alias("values")).show()
+----+------+
|name|values|
+----+------+
| a| 1.0|
| b| 0.0|
| c| 2.0|
+----+------+