Spark SQL: выбор значения Max среди строк с попарно столбцами (AB) и (BA) - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть 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),удалите его как дубликат, затем примените раздел окна, если я решу использовать ответы на эти вопросы.(даже в этом случае я теряю направление, если мне нужно использовать результат в Графике направления)

1 Ответ

0 голосов
/ 02 декабря 2018

, если вас не волнует направление:

import org.apache.spark.sql.types.DoubleType
import org.apache.spark.sql.functions._

val t2=tempDF.withColumn("key_1",when($"keyword1"<$"keyword2", $"keyword1").otherwise($"keyword2")).withColumn("key_2",when($"keyword1"<$"keyword2", $"keyword2").otherwise($"keyword1")).withColumn("val",$"val".cast(DoubleType))

t2.groupBy($"key_1",$"key_2").max("val").show()
+-----+-----+--------+
|key_1|key_2|max(val)|
+-----+-----+--------+
|    B|    C|     4.2|
|    D|    E|     5.2|
|    A|    B|     1.2|
+-----+-----+--------+

, если вам не безразлично направление

val t3=t2.groupBy($"key_1",$"key_2").agg(first($"val").as("fval"),max($"val").as("max"))
 t3.withColumn("k1",when($"fval"<$"max",$"key_2").otherwise($"key_1")).withColumn("k2",when($"fval"<$"max",$"key_1").otherwise($"key_2")).select($"k1",$"k2",$"max").show()
+---+---+---+
| k1| k2|max|
+---+---+---+
|  C|  B|4.2|
|  E|  D|5.2|
|  A|  B|1.2|
+---+---+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...