更改 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 2.0 中的 DataFrame 列创建数据集?