将结构列转换为Scala列表

时间:2018-06-26 17:25:48

标签: 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, 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))

2 个答案:

答案 0 :(得分:0)

您应使用.表示法选择struct列以分隔列,并使用该列名将其转换为{{1}的tuple函数中的map },您应该会得到所需的输出。

rdd

我希望答案会有所帮助

答案 1 :(得分:0)

由于您已有case class,因此可以在收集数据时利用它。在使用DataFrame之前,只需将DataSet[Class1]转换为collect。这将为您提供所需的列表:

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