Apache spark 数据帧转换未引发溢出异常并生成null 从pyspark.sql.functions导入* 从pyspark.sql.types导入*
我正在尝试将数据帧强制转换为df.column.cast(ShortType()),但当我尝试插入数据99999时,它正在转换为null而不会引发任何错误,因此您能否建议任何方法在转换时引发错误。如果强制转换出错,Spark不会引发错误Apache spark 数据帧转换未引发溢出异常并生成null 从pyspark.sql.functions导入* 从pyspark.sql.types导入*,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我正在尝试将数据帧强制转换为df.column.cast(ShortType()),但当我尝试插入数据99999时,它正在转换为null而不会引发任何错误,因此您能否建议任何方法在转换时引发错误。如果强制转换出错,Spark不会引发错误 作为捕获这些错误的自定义方法,您可以编写一个在强制转换为null时抛出的。但是,这会恶化脚本的性能,因为Spark无法优化UDF执行。如果pyspark.sql.Column.cast失败,Spark将自动失败,即整个列将变为NULL。您有几个选项可以解决此问题
作为捕获这些错误的自定义方法,您可以编写一个在强制转换为null时抛出的。但是,这会恶化脚本的性能,因为Spark无法优化UDF执行。如果pyspark.sql.Column.cast失败,Spark将自动失败,即整个列将变为
NULL
。您有几个选项可以解决此问题:
mode=failfast
集进行读取,例如:df=spark.createDataFrame([(1,0,0,2),(1,1,1,1)],['c1','c2','c3','c4']
df.toPandas()到_csv(“./test.csv”)
spark.read.csv(“./test.csv”).show()
+----+---+---+---+---+
|_c0 | uC1 | uC2 | uC3 | uC4|
+----+---+---+---+---+
|空| c1 | c2 | c3 | c4|
| 0| 1| 0| 0| 2|
| 1| 1| 1| 1| 1|
+----+---+---+---+---+
运行spark.read.schema(“\u c0 INT、\u c1 INT、\u c2 INT、\u c3 INT、\u c4 INT”)。选项(“mode”、“failfast”).csv(“./test.csv”)。show()
抛出:
org.apache.spark.SparkException:在记录解析中检测到格式错误的记录。解析模式:FAILFAST。
因为\u c1
到\u c4
中的记录是第一行的字符串(因为默认情况下header=False
,所以头被视为行)。这可以在stacktrace中更深入地找到:原因:java.lang.NumberFormatException:对于输入字符串:“\u c1”
。比较,跑步
spark.read.schema("_c0 INT, c1 INT, c2 INT, c3 INT, c4 INT").option("mode", "ignore").csv("./test.csv").show()
+----+----+----+----+----+
| _c0| c1| c2| c3| c4|
+----+----+----+----+----+
|null|null|null|null|null|
| 0| 1| 0| 0| 2|
| 1| 1| 1| 1| 1|
+----+----+----+----+----+
但是将抛出以下警告WARN ParseMode:ignore不是有效的解析模式。使用许可。
pandas\u UDF
,因为它是矢量化的)。在这里,当您试图匹配Python/Pandas使用的类型与PySpark使用的JVM类型时,您可能会遇到难以调试的类型匹配错误。这方面的一个例子是:ValueError:以10为基数的int()的文本无效:“b”
import pyspark.sql.functions as f
df2 = spark.createDataFrame([("a",0,0,2),("b",1,1,1)],['c1','c2','c3','c4'])
df2.show()
+---+---+---+---+
| c1| c2| c3| c4|
+---+---+---+---+
| a| 0| 0| 2|
| b| 1| 1| 1|
+---+---+---+---+
@f.pandas_udf("long")
def my_cast(column):
return column.astype("int64")
df2.select(my_cast(f.col("c1"))).show()