将结构列转换为Scala列表

将结构列转换为Scala列表,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我的数据框中有一个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, Doubl

我的数据框中有一个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))

您应该使用
符号选择
结构
列来分隔列,并使用该列名将其转换为
rdd
映射
函数中的
元组
,您应该会得到所需的输出

df.select($"col1.*").rdd.map(x=> (x.getAs[Integer]("x1"), x.getAs[Double]("x2"))).collect.toList
//List((10,5.5), (7,2.1))

我希望答案有帮助

,因为您已经有了一个
案例类
,您可以在收集数据时利用它。在使用
collect
之前,只需将
DataFrame
转换为
DataSet[Class1]
。这将为您提供所需的列表:

df.select($"col1.*").as[Class1].collect().toList

org.apache.spark.sql.AnalysisException:无法解析给定输入列[col1]的“
x1
”@约翰瓦勒:修正了,谢谢你指出。答案中有一个输入错误,应该是
select($“col1.*)
,而不是
select($“col1”)