Spark DataFrame:查找并设置子节点的主根

问题描述 投票:1回答:1

我有以下Apache Spark数据框:

父母-孩子A1-A10A1-A2A2-A3A3-A4A5-A7A7-A6A8-A9

此DataFrame显示父级和子级之间的连接。逻辑上看起来像这样:enter image description here

主要目标是为每个孩子设置主要根。这意味着我们应该具有以下数据框:

父母-孩子A1-A10A1-A2A1-A3A1-A4A5-A7A5-A6A8-A9

一切都应该使用Apache Spark来实现。

apache-spark apache-spark-sql apache-spark-dataset apache-spark-2.0
1个回答
0
投票

使用以下方法,我相信您可以实现

val input_rdd = spark.sparkContext.parallelize(List(("A1", "A10"), ("A1", "A2"), ("A2", "A3"), ("A3", "A4"), ("A5", "A7"), ("A7", "A6"), ("A8", "A9"), ("A4", "A11"), ("A11", "A12"), ("A6", "A13")))
val input_df = input_rdd.toDF("Parent", "Child")
input_df.createOrReplaceTempView("TABLE1")
input_df.show()

输入

+------+-----+
|Parent|Child|
+------+-----+
|    A1|  A10|
|    A1|   A2|
|    A2|   A3|
|    A3|   A4|
|    A5|   A7|
|    A7|   A6|
|    A8|   A9|
|    A4|  A11|
|   A11|  A12|
|    A6|  A13|
+------+-----+

val output_df1 = spark.sql(“”“从TABLE1中选择不同的a.parent,b.child,在a.parent = b.parent或a.child = b.parent上选择内部连接TABLE1 b”“”)

output_df1.createOrReplaceTempView("TEMP1")

val output_df2 = spark.sql(“”“ select * from(从TEMP1中选择不同的a.parent,b.child,a.parent = b.parent或a.child = b.parent上的内部联接TEMP1 b,其中a .parent not in((从TABLE1中选择与众不同的b.child来自a.parent = b.parent或a.child = b.parent的内部联接TABLE1 b))“”“)

output_df2.createOrReplaceTempView("TEMP2")

spark.sql(“”“ SELECT * FROM(从TEMP2 UNION中选择*,从TABLE1 a中选择*,其中a.child不在(从TEMP2中选择子))ORDER BY parent,child”“)。show()] >

输出

+------+-----+
|parent|child|
+------+-----+
|    A1|  A10|
|    A1|  A11|
|    A1|   A2|
|    A1|   A3|
|    A1|   A4|
|   A11|  A12|
|    A5|  A13|
|    A5|   A6|
|    A5|   A7|
|    A8|   A9|
+------+-----+

我希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.