如何更新嵌套列

学习如何更新中嵌套列数据砖。

写的亚当Pavlacka

去年发表在:2022年5月31日

火花不支持添加新的列或删除现有列嵌套结构。特别是,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]] | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - +


这篇文章有用吗?