DataSet Spark 的用例是啥?
Posted
技术标签:
【中文标题】DataSet Spark 的用例是啥?【英文标题】:What's the use case of DataSet Spark?DataSet Spark 的用例是什么? 【发布时间】:2020-06-06 12:44:34 【问题描述】:我有这段代码,几乎所有的转换都使用返回数据框的 withColumn 函数。我使用 as[Recipe] 将从 preProcessing 返回的数据帧转换为数据集,但是由于所有函数都使用 .as 一遍又一遍地返回数据帧没有意义。
所以我的问题是 DataSet[U] over Dataset[Row]/DataFrame 的用例是什么?在我的情况下,是否值得使用 Dataset,因为每次转换(带有列)架构都会发生变化?
case class Recipe(
name: String,
ingredients: String,
url: String,
image: String,
cookTime: String,
recipeYield: String,
datePublished: DateType,
prepTime: String,
description: String
)
private def preProcessing[T](spark: SparkSession, data: DataFrame): DataFrame =
data
.transform(lowerCaseColumn("ingredients"))
.transform(lowerCaseColumn("name"))
.transform(covertStringToDate("datePublished"))
private def transform[T](
spark: SparkSession,
data: Dataset[Recipe]
): DataFrame =
data
.transform(filterRecipesWithBeef())
.persist(StorageLevel.MEMORY_AND_DISK_SER)
.transform(covertRecipeTimeColToMinutes("cookTime"))
.transform(covertRecipeTimeColToMinutes("prepTime"))
.transform(calculateTotalCookingTime())
.transform(calculateRecipeDifficulty())
.transform(calculateAvgCookingtimeByDifficulty())
【问题讨论】:
【参考方案1】:将 DataFrame 视为通用对象 Dataset[Row] 集合的别名,其中 Row 是通用的无类型 JVM 对象。相比之下,数据集是强类型 JVM 对象的集合,由您在 Scala 中定义的案例类决定。这意味着 Dataset[T] 在编译时显示语法错误和分析错误
【讨论】:
我知道这个(Dataset[Row]) 和 Dataset[U] 有编译时错误。但除此之外还有什么用例。好像不太实用。并且在我的情况下,每次转换都会改变架构,因此 Dataset[U] 不合适。对吗?【参考方案2】:数据集正在进行中。确实如第一个答案和博客中其他地方所述的类型安全和编译时错误,但与 2.x - 可能与 v3.x 不同,有许多问题需要考虑。例如
存在未扩展到 DS 的无类型 DF 函数。
分组依据、聚合等怎么样?名字丢失了。
JSON 灵活模式?
我是一名架构师,但在担任数据工程师期间注意到,数据集的使用并不像吹捧的那么容易。 DFs 暂时更实用。我对 Spark 3 进行了快速扫描,但没有注意到任何重大变化。我查看了两个项目,但找不到任何可以排除我的 cmets 的东西(目前)。
【讨论】:
以上是关于DataSet Spark 的用例是啥?的主要内容,如果未能解决你的问题,请参考以下文章
cudaGraphicsGLRegisterImage中cudaGraphicsRegisterFlagsWriteDiscard的用例是啥?