我的数据框中有一个struct列,我想将其作为Scala列表收集。
case class Class1(x1: Integer, x2: Double)
val df = Seq(("a", Class1(10,5.5)), ("b", Class1(7,2.1))).toDF("id", "col1")
当我尝试将struct列转换为RDD
并收集它时:
df.select($"col1").rdd.map(x => x.asInstanceOf[Array[(Integer, Double)]]).collect()
我收到此错误:
Caused by: java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to [Lscala.Tuple2;
我想回来
List((10,5.5),(7,2.1))
答案 0 :(得分:0)
您应使用.
表示法选择struct
列以分隔列,并使用该列名将其转换为{{1}的tuple
函数中的map
},您应该会得到所需的输出。
rdd
我希望答案会有所帮助
答案 1 :(得分:0)
由于您已有case class
,因此可以在收集数据时利用它。在使用DataFrame
之前,只需将DataSet[Class1]
转换为collect
。这将为您提供所需的列表:
df.select($"col1").as[Class1].collect().toList