如何从给定的案例类创建一行?

时间:2018-02-12 20:31:29

标签: scala apache-spark apache-spark-sql

想象一下,您有以下案例类:

case class B(key: String, value: Int)
case class A(name: String, data: B)

给定A的实例,如何创建Spark Row? e.g。

val a = A("a", B("b", 0))
val row = ???

注意:给定row我需要能够获取数据:

val name: String = row.getAs[String]("name")
val b: Row = row.getAs[Row]("data")

3 个答案:

答案 0 :(得分:1)

很短但可能不是最快,因为它首先创建一个数据帧,然后再次收集它:

import session.implicits._
val row = Seq(a).toDF().first()

答案 1 :(得分:1)

以下内容似乎与您所寻找的内容相符。

       Date
0   2018-01-03
1   2018-01-02
2   2018-01-01
3   2017-12-21
4   2017-12-20
5   2017-12-19
6   2017-12-18

答案 2 :(得分:-1)

我认为没有可以直接执行的公共API。内部Spark使用Encoder.toRow方法转换对象org.apache.spark.sql.catalyst.expressions.UnsafeRow,但此方法是私有的。你可以尝试:

  • 获取班级Encoder

    val enc: Encoder[A] = ExpressionEncoder()
    
  • 使用反射来访问toRow方法并将其设置为可访问。

  • 将其调用以将对象转换为UnsafeRow
  • 获取预期架构RowEncoder)的enc.schema
  • UnsafeRow转换为Row

我没试过这个,所以我不能保证它会起作用。