代码之家  ›  专栏  ›  技术社区  ›  mikeL

将结构列转换为scala列表

  •  1
  • mikeL  · 技术社区  · 6 年前

    我的数据框架中有一个结构列,我想将它收集为scala列表。

    case class Class1(x1: Integer, x2: Double)
    
    val df = Seq(("a", Class1(10,5.5)), ("b", Class1(7,2.1))).toDF("id", "col1")
    

    当我尝试将结构列转换为 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 回复  |  直到 6 年前
        1
  •  0
  •   Shaido MadHadders    6 年前

    既然你已经有了 case class 您可以在收集数据时利用它。只需转换 DataFrame DataSet[Class1] 使用前 collect .这将为您提供所需的列表:

    df.select($"col1").as[Class1].collect().toList
    
        2
  •  0
  •   Ramesh Maharjan    6 年前

    你应该使用 . 符号选择 struct 列分隔列并使用该列名称将其转换为 tuple 在里面 map 功能 rdd 你应该得到你想要的输出。

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

    我希望答案有帮助