Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 数据帧转换未引发溢出异常并生成null 从pyspark.sql.functions导入* 从pyspark.sql.types导入*_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Apache spark 数据帧转换未引发溢出异常并生成null 从pyspark.sql.functions导入* 从pyspark.sql.types导入*

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。您有几个选项可以解决此问题

我正在尝试将数据帧强制转换为df.column.cast(ShortType()),但当我尝试插入数据99999时,它正在转换为null而不会引发任何错误,因此您能否建议任何方法在转换时引发错误。

如果强制转换出错,Spark不会引发错误


作为捕获这些错误的自定义方法,您可以编写一个在强制转换为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不是有效的解析模式。使用许可。

  • 您的第二个选择是使用UDF(或者更好,使用
    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()