У меня есть Dataframe, который представляет одновременное вхождение слов и значение, представляющее вероятность их порядков.
Если мое предложение равно "A B C D E"
, то моя таблица совпадений выглядит следующим образом (упрощеннопример):
val tempDF = spark.createDataFrame(Seq(
(0, "A", "B", "1.2"),
(1, "B", "A", "0.2"),
(2, "B", "C", "2.2"),
(3, "C", "B", "4.2"),
(4, "D", "E", "1.2"),
(5, "E", "D", "5.2")
)).toDF("id", "keyword1", "keyword2", "val").withColumn("id", monotonically_increasing_id())
+---+---------+---------+---+
|id |keyword1 |keyword2 |val|
+---+---------+---------+---+
|0 |A |B |1.2|
|1 |B |A |0.2|
|2 |B |C |2.2|
|3 |C |B |4.2|
|4 |D |E |1.2|
|5 |E |D |5.2|
+---+---------+---------+---+
Я знаю, как удалить дубликаты пар.В случае A B
и B A
я могу сделать следующее, чтобы сохранить A B
или B A
, когда меня не волнует столбец val
:
tempDF.where(tempDF("keyword2") < tempDF("keyword1"))
+---+---------+---------+---+
| id|keyword1 |keyword2 |val|
+---+---------+---------+---+
| 1| B| A|0.2|
| 3| C| B|4.2|
| 5| E| D|5.2|
+---+---------+---------+---+
Вопросесть ли способ (эффективный, если это возможно) сохранить пару, которая имеет большее значение своего обратного?Это мой идеальный результат:
+---+---------+---------+---+
|id |keyword1 |keyword2 |val|
+---+---------+---------+---+
|0 |A |B |1.2|
|3 |C |B |4.2|
|5 |E |D |5.2|
+---+---------+---------+---+
Реальный пример:
val wordDataFrame = spark.createDataFrame(Seq(
(0, Array("Hi", "I", "heard", "about", "apache", "spark"))
)).toDF("id", "words").withColumn("id", monotonically_increasing_id())
Результат после вычисления совпадения (поскольку это только одно предложение, числане имеют никакого смысла. Они на самом деле разные):
+--------+--------+-----+-------+---+
|Keyword1|Keyword2|coOcc|occKey |val|
+--------+--------+-----+-------+---+
| about| hi| 1| 1|1.0|
| about| apache| 1| 1|1.0|
| about| heard| 1| 1|1.0|
| about| spark| 1| 1|1.0|
| about| i| 1| 1|1.0|
| apache| i| 1| 1|1.0|
| apache| spark| 1| 1|2.0|
| apache| hi| 1| 1|1.0|
| apache| about| 1| 1|1.0|
| apache| heard| 1| 1|1.0|
| heard| spark| 1| 1|1.0|
| heard| i| 1| 1|1.0|
| heard| apache| 1| 1|1.0|
| heard| hi| 1| 1|1.0|
| heard| about| 1| 1|1.0|
| hi| spark| 1| 1|1.0|
| hi| i| 1| 1|2.0|
| hi| about| 1| 1|1.0|
| hi| heard| 1| 1|1.0|
| hi| apache| 1| 1|1.0|
| i| hi| 1| 1|1.0|
| i| apache| 1| 1|1.0|
| i| about| 1| 1|1.0|
| i| heard| 1| 1|1.0|
| i| spark| 1| 1|1.0|
| spark| apache| 1| 1|0.5|
| spark| i| 1| 1|1.0|
| spark| hi| 1| 1|1.0|
| spark| about| 1| 1|1.0|
| spark| heard| 1| 1|1.0|
+--------+--------+-----+-------+---+
Мне нужно удалить дублирующиеся пары, сохранив пары с большими значениями: (spark, apache, 0.5)(apache, spark, 2.0)
-> оставить (apache, spark, 2.0)
и удалитьпрочее.
ОБНОВЛЕНИЕ : Как видно, в другой строке всегда есть строка с (ключевое слово1, ключевое слово2, значение) и (ключевое слово2, ключевое слово1, значение). Каждая строка уникальна , потому что таблица генерируется groupBy
.Ответы на следующий вопрос не помогли мне, так как таблица в этом вопросе всегда (key1, key2, value). Как выбрать первый ряд каждой группы?
Мне нужно знать, какой ряд следует перевернуть, преобразовать my (B, A, 0.2) в (A, B, 0.2),удалите его как дубликат, затем примените раздел окна, если я решу использовать ответы на эти вопросы.(даже в этом случае я теряю направление, если мне нужно использовать результат в Графике направления)