在 spark 数据框中使用 case class 的好处
Benefit of using case class in spark dataframe
在 spark dataframe 中使用 case class 有什么好处?我可以使用 "inferschema" 选项定义架构或定义 Structtype 字段。
我提到
“https://docs.scala-lang.org/tour/case-classes.html”但无法理解除了使用反射生成模式之外使用案例 class 的优势是什么。
inferschema 可能是一项昂贵的操作,并且会不必要地延迟错误行为。考虑以下伪代码
val df = loadDFWithSchemaInference
//doing things that takes time
df.map(row => row.getAs[String]("fieldName")).//more stuff
现在在您的这段代码中,您已经假设 fieldName
属于 String
类型,但它只是在您的处理后期表达和确保,如果它不是,则会导致不幸的错误'实际上 String
现在,如果您改为这样做
val df = load.as[CaseClass]
或
val df = load.option("schema", predefinedSchema)
fieldName
是一个 String
的事实将是一个先决条件,因此您的代码将更健壮且更不容易出错。
如果你在 REPL 中做探索性的事情或者例如Zeppelin 但不应在操作代码中使用。
编辑附录:
我个人更喜欢使用 case 类 而不是 schemas,因为我更喜欢 Dataset
API 而不是 Dataframe
API(即 Dataset[Row]
)稳健性原因。
在 spark dataframe 中使用 case class 有什么好处?我可以使用 "inferschema" 选项定义架构或定义 Structtype 字段。 我提到 “https://docs.scala-lang.org/tour/case-classes.html”但无法理解除了使用反射生成模式之外使用案例 class 的优势是什么。
inferschema 可能是一项昂贵的操作,并且会不必要地延迟错误行为。考虑以下伪代码
val df = loadDFWithSchemaInference
//doing things that takes time
df.map(row => row.getAs[String]("fieldName")).//more stuff
现在在您的这段代码中,您已经假设 fieldName
属于 String
类型,但它只是在您的处理后期表达和确保,如果它不是,则会导致不幸的错误'实际上 String
现在,如果您改为这样做
val df = load.as[CaseClass]
或
val df = load.option("schema", predefinedSchema)
fieldName
是一个 String
的事实将是一个先决条件,因此您的代码将更健壮且更不容易出错。
如果你在 REPL 中做探索性的事情或者例如Zeppelin 但不应在操作代码中使用。
编辑附录:
我个人更喜欢使用 case 类 而不是 schemas,因为我更喜欢 Dataset
API 而不是 Dataframe
API(即 Dataset[Row]
)稳健性原因。