Se eu converter uma coluna para um tipo diferente, quaisquer dados que não possam ser convertidos serão convertidos silenciosamente em um 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|
+------+
Existe alguma maneira de a conversão produzir um erro se algum valor não puder ser convertido?
Respostas:
0 para resposta № 1Você pode escrever seu próprio udf
para isso usando python "s float
função que gera um erro quando a string não pode ser convertida em flutuante:
import pyspark.sql.functions as F
@F.udf
def cast_safe(x):
return float(x)
df.select(cast_safe(df.values).alias("values")).show()
[Etapa 5:> (0 + 3) / 3] 17/09/29 09:00:29 ERRO Executor: Exceção na tarefa 2.0 em estágio 5.0 (TID 11) org.apache.spark.api.python.PythonException: Traceback (última chamada mais recente): Arquivo "C: sparkspark-2.0.1pythonlibpyspark.zippysparkworker.py", linha 172, em principal Arquivo "C: sparkspark-2.0.1pythonlibpyspark.zippysparkworker.py", linha 167, em processo Arquivo "C: sparkspark-2.0.1pythonlibpyspark.zippysparkworker.py", linha 106, em Arquivo "C: sparkspark-2.0.1pythonlibpyspark.zippysparkworker.py", linha 92, em Arquivo "C: sparkspark-2.0.1pythonlibpyspark.zippysparkworker.py", linha 70, em Arquivo "", linha 3, em cast_safe ValueError: não foi possível converter a string em float: foo
Enquanto estiver trabalhando corretamente, se todos os elementos da coluna puderem ser convertidos com segurança:
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|
+----+------+