【发布时间】:2018-12-03 10:15:16
【问题描述】:
很抱歉问了一个简单的问题。我想将案例类传递给函数参数,并且我想在函数内部进一步使用它。到目前为止,我已经尝试使用 TypeTag 和 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)
【问题讨论】:
-
as的签名是什么?是否需要一个隐式的“阅读器”来进行转换(例如 PlayJSON)?然后你可以做类似def readCSV[T](path: String)(implicit reader: Reader[T]): Dataset[T] -
这里(在 Spark 中)的“阅读器”看起来被称为
Encoder[T]。因此,该类型的隐式应该可以工作。 -
嗨,据我了解,
as将case class名称作为参数将dataframe转换为dataset中的dataset。我像这样使用它。我还在学习spark和scala。你说的那种类型的隐含是什么意思?你可以解释吗?如果我有val infoEncoder = someEncoder之类的东西,那么你的意思是我应该在readCsv方法中传递infoEncoder吗?
标签: scala apache-spark apache-spark-dataset case-class classtag