火花不支持添加新的列或删除现有列嵌套结构。特别是,withColumn和下降的方法数据集类不允许您指定一个列名不同于任何顶级列。例如,假设您有一个数据集使用以下模式:
% scala val模式=(新StructType)阀门(阀门“元数据”,(新StructType) (“eventid”、“字符串”,真正的)阀门(“主机名”,“弦”,真正的)阀门(“时间戳”,“弦”,真正的),真的)阀门(阀门“物品”,(新StructType)(“书”,(新StructType)。添加(“费用”,“双”,真的),真正的阀门)(“纸”,(新StructType)。add(“页面”,“int”,真的),真的),真的)schema.treeString
模式看起来像:
根|——元数据:结构(可空= true) | |——eventid:字符串(nullable = true) | |——主机名:字符串(nullable = true) | |——时间戳:字符串(nullable = true) |——项目:结构(可空= true) | |——书:结构(可空= true) | | | -费用:双(nullable = true) | |——纸:结构(可空= true) | | |——页面:整数(nullable = true)
假设你有DataFrame:
% scala val抽样:抽样(行)= sc.parallelize (Seq(行(行(“eventid1”、“hostname1”,“timestamp1”)、行(行(100.0)、行(10)))))val df =火花。createDataFrame(抽样模式)显示器(df)
你想增加费用列,这是嵌套的书,1%。更新费用列,您可以从现有的列和重建数据集更新的列如下:
% = df scala val更新。selectExpr (" " " named_struct(元数据,元数据,“物品”,named_struct(‘书’,named_struct(“费用”,items.books。费用* 1.01),“纸”,项目。纸))named_struct named_struct”“”) .select(美元)”。元数据”,“美元named_struct.items”) updated.show(假)
然后你会得到结果:
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + | | |项目元数据+ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + = = = = = = = = = = = = = = = = = + | | (eventid1, hostname1, timestamp1) [[101.0], [10]] | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - +