У меня есть DataFrame как:как сопоставить DataFrame к EdgeRDD
val data = sc.parallelize(Array((1,10,10,7,7),(2,7,7,7,8),(3, 5,5,6,8))).toDF("id","col1","col2","col3","col4")
То, что я хочу сделать, это создать EdgeRDD, где два Идентификаторы поделиться ссылкой, если они имеют то же значение, по меньшей мере, один колонн
id col1 col2 col3 col4
1 10 10 7 7
2 7 7 7 8
3 5 5 6 8
затем узел 1 и 2 имеют неориентированную ссылку 1--2, потому что они имеют общую ценность в col3.
По той же причине, узел 2 и 3 доли неориентированной связи, потому что они имеют общее значение в COL4
Я знаю, как решить эту проблему в уродливом виде (но у меня есть слишком много столбцов для принятия этого стратегия в моем реальном случае)
val data2 = data.withColumnRenamed("id", "idd").withColumnRenamed("col1", "col1d").withColumnRenamed("col2", "col2d").withColumnRenamed("col3", "col3d").withColumnRenamed("col4", "col4d")
val res = data.join(data2, data("id") < data2("idd")
&& (data("col1") === data2("col1d")
|| data("col2") === data2("col2d")
|| data("col3") === data2("col3d")
|| data("col4") === data2("col4d")))
//> res : org.apache.spark.sql.DataFrame = [id: int, col1: int, col2: int, col
//| 3: int, col4: int, idd: int, col1d: int, col2d: int, col3d: int, col4d: int
//| ]
res.show //> +---+----+----+----+----+---+-----+-----+-----+-----+
//| | id|col1|col2|col3|col4|idd|col1d|col2d|col3d|col4d|
//| +---+----+----+----+----+---+-----+-----+-----+-----+
//| | 1| 10| 10| 7| 7| 2| 7| 7| 7| 8|
//| | 2| 7| 7| 7| 8| 3| 5| 5| 6| 8|
//| +---+----+----+----+----+---+-----+-----+-----+-----+
//|
val links = EdgeRDD.fromEdges(res.map(row => Edge(row.getAs[Int]("id").toLong, row.getAs[Int]("idd").toLong, "indirect")))
//> links : org.apache.spark.graphx.impl.EdgeRDDImpl[String,Nothing] = EdgeRDD
//| Impl[27] at RDD at EdgeRDD.scala:42
links.foreach(println) //> Edge(1,2,indirect)
//| Edge(2,3,indirect)
как решить это для гораздо большего количества столбцов?
Не могли бы вы объяснить, какую часть вы найдете уродливой? условие 'join'? И 'data2' просто копия' data'? – zero323
сказать, что у меня есть 100 столбцов, мне не нравится указывать === для каждого столбца ... должен быть способ автоматизировать эту часть? или, может быть, нет ... :( – user299791
yep, извините, забыл добавить эту часть ... только что отредактировал – user299791