我在 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)