Spark Dataframe API: group by id and compute combinations

Обновить

December 2018

Просмотры

473 раз

2

Как я могу использовать SPARK DataFrame API для группы по идентификатору, вычислять все комбинации значений в группе, и производить один выходной dataframe?

Пример :

val testSchema = StructType(Array(
  StructField("id", IntegerType),
  StructField("value", StringType)))

val test_rows = Seq(
    Row(1, "a"),
    Row(1, "b"),
    Row(1, "c"),
    Row(2, "a"),
    Row(2, "d"),
    Row(2, "e")
)
val test_rdd = sc.parallelize(test_rows)
val test_df = sqlContext.createDataFrame(test_rdd, testSchema)

Ожидаемые результаты :

1 a b
1 a c
1 b c
2 a d
2 a e
2 d e

Лучшее решение до сих пор:

Выполните автообъединение, фильтр ид равенства и устранения одинаковых значений

val result = test_df.join(
    test_df.select(test_df.col("id").as("r_id"), test_df.col("value").as("r_value")),
    ($"id" === $"r_id") and ($"value" !== $"r_value")).select("id", "value", "r_value")


+---+-----+-------+
| id|value|r_value|
+---+-----+-------+
|  1|    a|      b|
|  1|    a|      c|
|  1|    b|      a|
|  1|    b|      c|
|  1|    c|      a|
|  1|    c|      b|
|  2|    a|      d|
|  2|    a|      e|
|  2|    d|      a|
|  2|    d|      e|
|  2|    e|      a|
|  2|    e|      d|
+---+-----+-------+

Оставшиеся проблемы: как устранить повторяющиеся наборы, например, (а, Ь) и (Ь, а) при выполнении присоединиться?

1 ответы

1

Есть ли у вас порядок на объектах в поле значения? Если это так, то кажется, что вы могли бы просто присоединиться к dataframe с самими собой, требуя при этом, что идентификаторы быть одинаковыми и значением из левой таблицы меньше, чем значение из таблицы справа.

[править] Если у вас нет упорядоченности, и у вас есть достаточно несколько значений для каждого идентификатора, другое решение состоит в использовании , groupByKeyа затем создать все комбинации из полученной последовательности, что можно сделать еще проще , чем создавать все пары , а затем только поддерживая половина. (Если вы используете Scala, например, я считаю , Seq«s combinationфункция [документ] будет делать то , что вам это нужно.) Это будет работать гораздо хуже , чем автообъединение подход для большинства наборов данных.