Как получить пары по столбцу в искровом фрейме данных, например python pandas?

Привет ~ Я новичок в искре. Я хочу получить пары со столбцом в фрейме данных, каждый элемент в столбце ("all_mv_id") заставляет другие составлять пары, например:

До:

+---------+
|all_mv_id|
+---------+
|      131|
|      121|
|     2223|
|   123412|
|     3982|
+---------+

после:

+------+------+
|  id_1|  id_2|
+------+------+
|   131|   121|
|   131|  2223|
|   131|123412|
|   131|  3982|
|   131| 54281|
|   121|  2223|
|   121|123412|
|   121|  3982|
|   121| 54281|
|  2223|123412|
|  2223|  3982|
|  2223| 54281|
|123412|  3982|
|123412| 54281|
|  3982| 54281|
+------+------+

Я имею в виду, что в python pandas я сделаю так:

# generate data
ids = [('all_mv_id', ['131', '121', '2223', '123412', '3982', '54281'])]
df = pd.DataFrame.from_items(ids)

all_mv_id = list(df.all_mv_id)
temp_container = []
for i in range(len(all_mv_id)):
    for j in range(i+1,len(all_mv_id)):
        temp_container.append([all_mv_id[i],all_mv_id[j]])

df_1 = pd.DataFrame(temp_container)
df_1.columns = ["id_1", "id_2"]

Но как перевести этот питон в пандах на scala в искровом фрейме данных? Я пробовал ListBuffer, но кажется, что в него нельзя добавлять кортежи.


person konverse    schedule 23.09.2019    source источник


Ответы (1)


Я предполагаю, что обычное самостоятельное соединение с условием left.id < right.id должно работать:

val df = List("131", "121", "2223", "123412", "3982").toDF("id")

df.as("left")
    .join(df.as("right"), $"left.id" < $"right.id")
    .select($"left.id" as "id_1", $"right.id" as "id_2")
    .show

Результат:

+------+------+
|  id_1|  id_2|
+------+------+
|   131|  2223|
|   131|  3982|
|   131| 54281|
|   121|   131|
|   121|  2223|
|   121|123412|
|   121|  3982|
|   121| 54281|
|  2223|  3982|
|  2223| 54281|
|123412|   131|
|123412|  2223|
|123412|  3982|
|123412| 54281|
|  3982| 54281|
+------+------+
person Krzysztof Atłasik    schedule 23.09.2019
comment
Большое спасибо ~~ Понял ~ Спасибо ~ - person konverse; 24.09.2019
comment
@konverse Если вы нашли этот ответ полезным, можете принять его :) - person Krzysztof Atłasik; 24.09.2019
comment
Извините ~ Я пробовал ~ Но система показала Спасибо за отзыв! Голоса, отданные теми, у кого репутация менее 15, записываются, но не изменяют общедоступный рейтинг публикации. о (╥﹏╥) о - person konverse; 27.09.2019
comment
@konverse Под кнопкой "за" есть кнопка "галочка", чтобы принять ответ. Если вы примете его, вы также получите два очка репутации :) - person Krzysztof Atłasik; 27.09.2019