联合两个具有嵌套不同模式的数据框

Posted

技术标签:

【中文标题】联合两个具有嵌套不同模式的数据框【英文标题】:union two dataframes with nested different schemas 【发布时间】:2018-11-27 01:42:10 【问题描述】:

Dataframe1 是这样的

root
 |-- source: string (nullable = true)
 |-- results: array (nullable = true)
 |    |-- content: struct (containsNull = true)
 |    |    |-- ptype: string (nullable = true)
 |    |    |-- domain: string (nullable = true)
 |    |    |-- verb: string (nullable = true)
 |    |    |-- foobar: map (nullable = true)
 |    |    |    |-- key: string
 |    |    |    |-- value: string (valueContainsNull = true)
 |    |    |-- fooId: integer (nullable = true)
 |-- date: string (nullable = false)
 |-- hour: string (nullable = false)

数据框 2 如下所示:

root
 |-- source: string (nullable = true)
 |-- results: array (nullable = true)
 |    |-- content: struct (containsNull = true)
 |    |    |-- ptype: string (nullable = true)
 |    |    |-- domain: string (nullable = true)
 |    |    |-- verb: string (nullable = true)
 |    |    |-- foobar: map (nullable = true)
 |    |    |    |-- key: string
 |    |    |    |-- value: string (valueContainsNull = true)
 |-- date: string (nullable = false)
 |-- hour: string (nullable = false)

注意区别 - 第二个数据帧中没有 fooId。 如何将这两个数据框合并在一起? 我知道这两个模式需要相同才能联合。添加fooId 或删除fooId 的最佳方法是什么?(由于模式的结构,这不是微不足道的)进行这种联合的推荐方法是什么。 谢谢

【问题讨论】:

要使用union,两个数据框的架构需要匹配。因此,要么删除第一个数据帧中的 fooId 列,要么将其(作为 null 或任何常量值)添加到第二个数据帧。 @Shaido 我已经编辑了这个问题。我知道它必须是一样的。 @Shaido 我想了解人们如何在不改变固有结构的情况下处理这种情况。 要将嵌套列添加到数据框 2,请参阅此处 ***.com/questions/44831789/…。添加 fooId 与所有空值,然后你可以联合两者 上面的链接是给一个结构体添加一个嵌套列。您将如何对数组执行此操作? . 运算符无法访问它 【参考方案1】:

由于您考虑了两个数据框让 DF1 和 DF2,您可以删除 DF1 中的额外列并运行两个数据框的联合

// this is to remove the extra column in the dataframe
DF1.drop("fooId")

现在两个 DF 的列数相同,因此您可以进行联合

DF1.union(DF2)

【讨论】:

这不起作用 - 因为drop 不会删除嵌套列。

以上是关于联合两个具有嵌套不同模式的数据框的主要内容,如果未能解决你的问题,请参考以下文章

Hive View 查询性能:具有不同模式的联合表

从具有不同键的嵌套对象的值创建联合

只能对具有兼容列类型 Spark 数据框的表执行联合

如何找到具有不同ID的两个查询的联合

两个熊猫数据框的联合

具有不同行数的 Scikit Learn 特征联合