scala - 将案例类传递给函数参数
问题描述
抱歉问了一个简单的问题。我想将案例类传递给函数参数,并且我想在函数内部进一步使用它。到目前为止,我已经尝试过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)
解决方案
有两点需要注意
- 类名应该在
CamelCase
,所以InfoData
. - 将类型绑定到 a
DataSet
后,它就不是 a 了DataFrame
。DataFrame
是 aDataSet
的通用名称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")
推荐阅读
- android - 如何在以编程方式更改 android 中的音频类型时隐藏音频滑块 UI?
- .net - .NET5 和 .NET 标准有什么区别?
- c# - 如何在 ASP.NET Core 3.1 生产中配置 IdentityServer
- python - 如何将多个用括号分隔的数字从 txt 文档中提取到 python 列表中?
- reactjs - 样式化的组件全局样式在 Next 中重复
- python - 如何通过 Airflow 轮询和跟踪外部作业状态?
- reactjs - 在 React(上下文 API)中运行效果之前,上下文总是会完全传播吗?
- r - 在包含特定名称的列上运行具有拟合值的线性回归模型
- git - 将其他存储库子目录的稀疏签出推送到我们的存储库
- jetbrains-ide - JetBrains Rider 在 Rider 中构建时运行 Pre/Post Build 事件