Я не уверен, что долгая работа делает это со мной, но я вижу некоторое неожиданное поведение в искре 2.2.0
Я создал игрушечный пример, как показано ниже
toy_df = spark.createDataFrame([
['p1','a'],
['p1','b'],
['p1','c'],
['p2','a'],
['p2','b'],
['p2','d']],schema=['patient','drug'])
Я создаю другой фрейм данных
mdf = toy_df.filter(toy_df.drug == 'c')
, как вы знаете, mdf будет
mdf.show()
+-------+----+
|patient|drug|
+-------+----+
| p1| c|
+-------+----+
Теперь, если я сделаю это
toy_df.join(mdf,["patient"],"left").select(toy_df.patient.alias("P1"),toy_df.drug.alias('D1'),mdf.patient,mdf.drug).show()
Удивительно, но я получу
+---+---+-------+----+
| P1| D1|patient|drug|
+---+---+-------+----+
| p2| a| p2| a|
| p2| b| p2| b|
| p2| d| p2| d|
| p1| a| p1| a|
| p1| b| p1| b|
| p1| c| p1| c|
+---+---+-------+----+
но если я использую
toy_df.join(mdf,["patient"],"left").show()
, я вижу ожидаемое поведение
patient|drug|drug|
+-------+----+----+
| p2| a|null|
| p2| b|null|
| p2| d|null|
| p1| a| c|
| p1| b| c|
| p1| c| c|
+-------+----+----+
, и если я использую выражение псевдонима на одном из кадров данных, я получаю ожидаемоеповедение
toy_df.join(mdf.alias('D'),on=["patient"],how="left").select(toy_df.patient.alias("P1"),toy_df.drug.alias("D1"),'D.drug').show()
| P1| D1|drug|
+---+---+----+
| p2| a|null|
| p2| b|null|
| p2| d|null|
| p1| a| c|
| p1| b| c|
| p1| c| c|
+---+---+----+
Поэтому мой вопрос заключается в том, каков наилучший способ выбора столбцов после объединения, и является ли это нормальным поведением
edit: согласно user8371915 это то же самое, что вопрос, помеченный как
Spark SQL, выполняющий объединение по карте, вместо внутреннего объединения
, но мой вопрос работает с двумя фреймами данных, которые имеют одинаковое происхождение и выполняют соединение при вызове метода show, но выбирают столбцы после поведения соединенияпо-другому .