How to create dataset from stored (variable or parameter) Seq
我有一个类似的功能:
1 2 3 4
| def createDataset [T ](seq :Seq [T ]): Dataset [T ] = {
import spark. implicits. _
seq. toDS()
} |
这没有编译,没有找到toDS功能。
它也不能以这种方式工作
1 2 3 4
| def createDataset [T ](t :T ): Dataset [T ] = {
import spark. implicits. _
Seq (t ). toDS()
} |
我正在使用的案例类是
1 2
| case class Person (id : Long, name : String, age : Int ) {}
case class Address (a _id :Long, street :String, number : Int ) {} |
我可以做些什么,让一个通用函数创建一个给定的T通用类(总是一个case类)的数据集?
编辑:
Terry Dactyl提供的解决方案不适用于我,并且在调用f函数时显示此错误
1 2 3 4 5 6 7 8 9 10 11 12
| import org. apache. spark. sql. {Dataset, Encoder, SparkSession }
def f [T <: Product : Encoder ](s : Seq [T ]): Dataset [T ] = {
val spark = SparkSession. builder. getOrCreate()
import spark. implicits. _
s. toDF. as[T ]
}
f (Seq (
Person (1, "John", 25)
Person (2, "Paul", 22)
)) |
未找到参数ev $ 1的隐式值:Encoder [Person]
- 您没有正确使用解决方案。在函数内部创建会话并在其闭包中引入隐式Encoder不会在外部作用域中引入Encoder[T]。必须像答案中那样提供隐含内容(在封尾之外)。
1 2 3 4 5 6 7 8 9 10 11
| import org. apache. spark. sql. _
import spark. implicits. _
def f [T <: Product : Encoder ](s : Seq [T ]): Dataset [T ] = {
s. toDF. as[T ]
}
case class C (a : Int, b : Int )
f (Seq (C (1, 2), C (3, 4), C (5, 6)))
res0 : org. apache. spark. sql. Dataset[C ] = [a : int, b : int] |
- 找不到参数ev $ 1的隐式函数:Encoder [MyType]
-
您可以编辑原始帖子以添加失败的示例,还是至少提供MyType的定义?
-
"失败的例子"是什么意思?我正在使用的案例类?所有的真实代码?
-
因此,至少要定义案例类。理想情况下是一个自包含程序
-
让我们继续聊天中的讨论。