Struct 和 MapType 有什么区别,以及如何在 Struct 上添加字段?

Eli*_*Eli 3 apache-spark apache-spark-sql

我尝试了解何时使用 Struct 以及何时使用 Map,因为两者都可以用作嵌套文档,例如
{field1 :value1 , field2 : value2}

我认为 struct 有一个模式,而 map 没有。另外,我认为 Map 可以将除 null 之外的所有类型作为键值,而结构只能将字符串作为键值?还有性能呢?


withField(String fieldName, Column col)但后来我发现我可以使用以下方法在结构上添加字段Column

所以我尝试写一个

public static Column aggregate(Column expr,
                               Column initialValue,
                               scala.Function2<Column,Column,Column> merge)
Run Code Online (Sandbox Code Playgroud)

并在每个步骤中使用以下命令将字段添加到结构中withField

我得到了这种类型不匹配,就像说结构应该只有字段"a",但我试图添加"ab"违反架构的字段

due to data type mismatch: argument 3 requires struct<a:string>, but got struct<a:string,ab:string>

我开始尝试{"a" : "b"}将这对添加"ab" "ewr"到聚合函数中。

*我在地图上尝试了同样的操作,效果很好,添加了该字段。

我可以解决这个问题,并将“ab”字段添加到结构中吗?如果不是的话,withField如果我们不能真正在结构上添加字段,为什么我们有这个?还是只有Map可以做到?我更喜欢使用 Map 中的结构,但我不确定何时使用每个结构。

小智 12

Struct 和 Map 类型之间的区别在于,在 Struct 中,我们定义了架构中所有可能的键,并且每个值可以具有不同的类型(键是字符串的列名)。但对于 Map,我们定义键和值的类型,然后我们可以添加任何尊重所提供类型的(键,值)。

当您使用Map时,您会发现您的数据文件比相同模式但使用Struct(例如parquet)要大得多,并且对于性能,它取决于数据格式以及该格式如何在磁盘上存储数据,但是几乎对于所有格式,处理 Map 类型都比 Struct 慢。

要将字段添加到嵌套列,您需要将旧列替换为包含新字段的新列:

df.withColumn("<col>", df.<col>.withField("<new field>", <col (lit or func)>))
Run Code Online (Sandbox Code Playgroud)