更改 Spark Dataframe 的架构

Posted

技术标签:

【中文标题】更改 Spark Dataframe 的架构【英文标题】:Change schema of Spark Dataframe 【发布时间】:2017-09-06 12:17:54 【问题描述】:

我有一个DataFrame[SimpleType]。 SimpleType 是一个包含 16 个字段的类。但是我必须把它改成DataFrame[ComplexType]

我只有 ComplexType 的模式(有 400 多个字段),这种类型没有案例类。我知道映射必要的字段(但我不知道如何从DataFrame[SimpleType] -> DataFrame[ComplexType] 映射它),其余字段我想保留为空。有谁知道如何以最有效的方式做到这一点?

谢谢

编辑

class SimpleType
field1
field2
field3
field4
.
.
.
field16

我有包含这种简单类型的 DataFrame。我也有一个复杂类型的模式。 我想转换这个DataFrame[SimpleType] -> Dataframe[ComplexType]

【问题讨论】:

发布您的输入和预期输出会有所帮助。 @philantrovert 完成,编辑帖子 【参考方案1】:

很简单:

// function to get field names
import scala.reflect.runtime.universe._


def classAccessors[T: TypeTag]: List[String] = typeOf[T].members.collect 
    case m: MethodSymbol if m.isCaseAccessor => m
.toList.map(s => s.name.toString)

val typeComplexFields = classAccessors[ComplexType]
val newDataFrame = simpleDF
                   .select(typeComplexFields
                            .map(c => if (simpleDF.columns.contains(c)) col(c) else lit(null).as(c)) : _*)
.as[ComplexType]

感谢Scala. Get field names list from case class 的作者,我已经复制了他的函数来获取修改后的字段名称

【讨论】:

@Tomasz 我已取消删除我的答案,如果之前没有工作请再次检查:) 感谢您的回答。对,我没有案例类 od ComplexType,因为它有 400 多个字段。我只有该 ComplexType 的架构,并且字段名称不同。

以上是关于更改 Spark Dataframe 的架构的主要内容,如果未能解决你的问题,请参考以下文章

如果 Dataframe 具有不同的模式,则使用附加模式的 Spark JDBC Oracle 写入也会更改表模式

如何更改 DataFrame 的架构(修复一些嵌套字段的名称)?

将 Spark DataFrame 架构转换为新架构

如何从 Spark 2.0 中的 DataFrame 列创建数据集?

每次转换/操作后 Spark Dataframe 随机 UUID 更改

动态和可配置地更改几种 Spark DataFrame 列类型