将数据帧作为嵌套结构插入到其他数据帧中



我在 Spark 中创建的两个数据帧

xml_df:

root
|-- _defaultedgetype: string (nullable = true)
|-- _mode: string (nullable = true)

和nodes_df:

root
|-- nodes: struct (nullable = false)
|    |-- _id: string (nullable = true)
|    |-- _label: string (nullable = true)

xml_df将始终只有一行,如下所述:

+----------------+------+
|_defaultedgetype| _mode|
+----------------+------+
|      undirected|static|
+----------------+------+

和nodes_df数据:

+-----+
|nodes|
+-----+
|[1,1]|
|[2,2]|
|[3,3]|
|[4,4]|
|[5,5]|
+-----+

我在nodes_df中使用结构函数将_id和_label放入结构中。基于此,我想在xml_df数据帧中添加第三列,其中包含在nodes_df数据帧中创建的结构。 我尝试使用连接函数为nodes_df中的每个条目创建一个文字 id,但列结果为 null。

请问有光吗?

我找到了为什么我的连接不起作用。

我需要对节点列使用聚合,因此我能够正确联接数据帧。

我为xml_df创建了一个 ID:

StructType(List(StructField("id",IntegerType, true),
StructField("_defaultedgetype",StringType, true),
StructField("_mode",StringType, true)))

nodes_df也是如此

val nodes_schema = StructType(List(
StructField("id",IntegerType, true),
StructField("_id",StringType, true),
StructField("_label",StringType, true)
))

我当时都使用了 ID 666,并在nodes_df

中使用了聚合
nodes_df = nodes_df.groupBy("id").agg(collect_set("nodes").as("node"))

并与xml_df一起加入:

xml_df = xml_df.join(nodes_df, Seq("id"),"right").drop("id")

结果是:

+----------------+------+--------------------+
|_defaultedgetype| _mode|                node|
+----------------+------+--------------------+
|      undirected|static|[[2,2], [3,3], [5...|
+----------------+------+--------------------+
root
|-- _defaultedgetype: string (nullable = true)
|-- _mode: string (nullable = true)
|-- node: array (nullable = true)
|    |-- element: struct (containsNull = true)
|    |    |-- _id: string (nullable = true)
|    |    |-- _label: string (nullable = true)

相关内容

最新更新