PySpark安全列类型转换

时间:2017-09-29 12:47:35

标签: apache-spark pyspark

如果我将列转换为其他类型,那么任何无法转换的数据都会以静默方式转换为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|
+------+

如果无法转换任何值,有没有办法让转换产生错误?

1 个答案:

答案 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|
+----+------+