/ / PySpark conversão de tipo de coluna segura - apache-spark, pyspark

Conversão do tipo de coluna segura PySpark - apache-spark, pyspark

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 № 1

Você 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|
+----+------+