将结构列转换为Scala列表
我的数据框中有一个struct列,我想将其收集为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
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”)
。