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 的用例是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Streams 和 Firehose 的用例是啥?

cudaGraphicsGLRegisterImage中cudaGraphicsRegisterFlagsWriteDiscard的用例是啥?

bash中noop [:]的用例是啥?

NuxtJs asyncData 的用例是啥?

TypeScript 中的“as const”是啥意思,它的用例是啥?

Python中“通过”的用例是啥? [复制]