将 Spark DataFrame 转换为稍微不同的案例类?

问题描述 投票:0回答:1

我在 HDFS 中有一些数据位于 parquet-protobuf 中。 由于一些项目限制,我想使用 Spark DataFrame 读取该数据(简单),然后转换为略有不同的案例类(即它具有相同的数据,但某些字段具有不同的名称,有些字段需要用字典翻译)。

我正在使用 Scala,但我想这并没有多大区别。

现在我无法使用 .as[CaseClass],因为架构不匹配。

我想我可以编写一个函数来将每一行转换为我的类,但据我所知,需要考虑源数据中字段的确切顺序来编写这样的函数,这可能是架构的问题进化。

我还有哪些其他选择?

谢谢!

dataframe scala apache-spark protocol-buffers
1个回答
0
投票

对此有一个通用的解决方案,但它使用 Spark 内部 api(因此 Spark 版本之间的确切代码会发生变化),但正如您所注意到的,您确实需要一个映射来对齐名称来驱动它。选择中使用的字段名称的顺序必须与案例类字段顺序匹配,因此模式演化无论如何都会受到案例类代码的限制。

明智的解决方案是,这不适用于 Spark Connect,您需要派生 CaseClass 的编码器(通过 Spark 的 Spark.implicits._ import 或 Frameless)并使用它来识别字段名称:

val enc = implicitly[Encoder[CaseClass]].asInstanceOf[ExpressionEncoder[CaseClass]]
val fieldsInOrderOfCaseClass = enc.schema

保存到其他模式也是如此。 (注意,这也适用于 Bean 编码器)。

给定架构,您可以处理列的映射和有序选择。

© www.soinside.com 2019 - 2024. All rights reserved.