抱歉问了一个简单的问题。我想将案例类传递给函数参数,并且想在函数内部进一步使用它。到目前为止我已经尝试过这个TypeTag
and ClassTag
但由于某种原因,我无法正确使用它,或者可能是我没有看到正确的位置。
用例与此类似:
case class infoData(colA:Int,colB:String)
case class someOtherData(col1:String,col2:String,col3:Int)
def readCsv[T:???](path:String,passedCaseClass:???): Dataset[???] = {
sqlContext
.read
.option("header", "true")
.csv(path)
.as[passedCaseClass]
}
它将被称为这样的东西:
val infoDf = readCsv("/src/main/info.csv",infoData)
val otherDf = readCsv("/src/main/someOtherData.csv",someOtherData)
有两件事你应该注意,
- 类名应该在
CamelCase
, so InfoData
.
- 一旦你将类型绑定到
DataSet
,它不是一个DataFrame
. DataFrame
是一个特殊的名字DataSet
通用的Row
.
您需要的是确保您提供的类具有相应的隐式实例Encoder
在当前范围内。
case class InfoData(colA: Int, colB: String)
Encoder
原始类型的实例(Int
, String
等)和case classes
可以通过导入获得spark.implicits._
def readCsv[T](path: String)(implicit encoder: Encoder: T): Dataset[T] = {
spark
.read
.option("header", "true")
.csv(path)
.as[T]
}
或者,您可以使用上下文绑定,
def readCsv[T: Encoder[T]](path: String): Dataset[T] = {
spark
.read
.option("header", "true")
.csv(path)
.as[T]
}
现在,您可以按如下方式使用它,
val spark = ...
import spark.implicits._
def readCsv[T: Encoder[T]](path: String): Dataset[T] = {
spark
.read
.option("header", "true")
.csv(path)
.as[T]
}
val infoDS = readCsv[InfoData]("/src/main/info.csv")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)