gpt4 book ai didi

scala - Some(null) 到 Stringtype nullable scala.matcherror

转载 作者:行者123 更新时间:2023-12-02 12:49:53 26 4
gpt4 key购买 nike

我有一个RDD[(Seq[String], Seq[String])],数据中包含一些空值。转换为数据帧的 RDD 如下所示

+----------+----------+
| col1| col2|
+----------+----------+
|[111, aaa]|[xx, null]|
+----------+----------+

示例代码如下:

val rdd = sc.parallelize(Seq((Seq("111","aaa"),Seq("xx",null))))
val df = rdd.toDF("col1","col2")
val keys = Array("col1","col2")
val values = df.flatMap {
case Row(t1: Seq[String], t2: Seq[String]) => Some((t1 zip t2).toMap)
case Row(_, null) => None
}
val transposed = values.map(someFunc(keys))

val schema = StructType(keys.map(name => StructField(name, DataTypes.StringType, nullable = true)))

val transposedDf = sc.createDataFrame(transposed, schema)

transposed.show()

它运行良好,直到我创建一个转置DF,但是一旦我点击显示,它就会抛出以下错误:

scala.MatchError: null
at org.apache.spark.sql.catalyst.CatalystTypeConverters$StringConverter$.toCatalystImpl(CatalystTypeConverters.scala:295)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$StringConverter$.toCatalystImpl(CatalystTypeConverters.scala:294)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$CatalystTypeConverter.toCatalyst(CatalystTypeConverters.scala:97)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$StructConverter.toCatalystImpl(CatalystTypeConverters.scala:260)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$StructConverter.toCatalystImpl(CatalystTypeConverters.scala:250)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$CatalystTypeConverter.toCatalyst(CatalystTypeConverters.scala:102)
at org.apache.spark.sql.catalyst.CatalystTypeConverters$$anonfun$createToCatalystConverter$2.apply(CatalystTypeConverters.scala:401)
at org.apache.spark.sql.SQLContext$$anonfun$6.apply(SQLContext.scala:492)
at org.apache.spark.sql.SQLContext$$anonfun$6.apply(SQLContext.scala:492)

如果 rdd 中没有空值,则代码可以正常工作。我不明白为什么当我有任何空值时它会失败,因为我将 StringType 的架构指定为 nullable 为 true。难道我做错了什么?我正在使用 Spark 1.6.1 和 scala 2.10

最佳答案

模式匹配是线性执行的,就像它在源中出现的那样,因此,这一行:

case Row(t1: Seq[String], t2: Seq[String]) => Some((t1 zip t2).toMap)

对 t1 和 t2 的值没有任何限制,与 null 值匹配无关。

实际上,在前面进行空检查,它应该可以工作。

关于scala - Some(null) 到 Stringtype nullable scala.matcherror,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43242025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com