Я выполняю соединение двух кадров данных с одинаковыми именами и значениями.
данные:
+----------------+------------------+
|id |name |
+----------------+------------------+
|2 |G2 |
|1 |H2 |
|2 |H2 |
|1 |G2 |
+----------------+------------------+
Код:
res = data.alias(
"C1"
).join(
data.alias(
"C2"
),
on='id',
how = "inner"
).select(
F.col("C1.{0}".format(name)).alias("C1"),
F.col("C2.{0}".format(name)).alias("C2"),
'id'
)
Я получаю результат как:
+----+----+----------------+
|C1 |C2 |id |
+----+----+----------------+
|G2 |H2 |2 |
|G2 |G2 |2 |
|H2 |G2 |1 |
|H2 |H2 |1 |
|H2 |H2 |2 |
|H2 |G2 |2 |
|G2 |G2 |1 |
|G2 |H2 |1 |
+----+----+----------------+
В то время как с внутренним соединением я ожидал, что результат будет таким:
+----------------+------------------+
|id |C1 | C2 |
+----------------+------------------+
|2 |G2 | G2 |
|1 |H2 | H2 |
|2 |H2 | H2 |
|1 |G2 | G2 |
+----------------+------------------+
Почему я получаю результат как объединение с 8 строками, а не с указанными выше 4 строками.
Внутреннее соединение будет соответствовать всем парам строк из двух таблиц, которые удовлетворяют заданным условиям. Вы просили, чтобы строки были объединены всякий раз, когда их идентификатор совпадает, поэтому первая строка будет соответствовать как первой, так и третьей строке, давая две соответствующие строки в результирующем фрейме данных. Точно так же все остальные строки будут соответствовать двум другим строкам с тем же идентификатором, поэтому в конце вы получите 8 строк.
Если вы хотите получить ожидаемый результат, вам не нужно объединение — просто продублируйте столбец C1 в C2, используя res = data.withColumn("C2", data["C1"]))
.