想象一下,您有以下案例类:
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")
答案 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
。我没试过这个,所以我不能保证它会起作用。