Pyspark Join, а затем выбор столбца показывает неожиданный вывод - PullRequest
0 голосов
/ 07 июня 2018

Я не уверен, что долгая работа делает это со мной, но я вижу некоторое неожиданное поведение в искре 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, но выбирают столбцы после поведения соединенияпо-другому .

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Лучший способ - использовать псевдонимы:

toy_df.alias("toy_df") \
    .join(mdf.alias("mdf"), ["patient"], "left") \
    .select(
        col("patient").alias("P1"),
        col("toy_df.drug").alias("D1"),
        col("patient").alias("patient"),
        col("mdf.drug").alias("drug")
    ) \
    .show()

Проблема в том, что mdf является производным от toy_df, поэтому и toy_df.drug, и mdf.drug относятся к одному и тому же столбцу.Поэтому, когда вы передаете их в select, Spark также возвращает значения из того же столбца.

0 голосов
/ 07 июня 2018

Мне удалось повторить ваши выводы, и мне хотелось бы получить ответ, почему это происходит.Однако я смог получить желаемые результаты, просто изменив псевдоним второго (правого) набора данных.Я изменил mdf.drug на mdf.drugs

mdf = toy_df.filter(toy_df.drug == 'c').select(toy_df.patient,toy_df.drug.alias("drugs"))

, поэтому после объединения ..

toy_df.join(mdf,["patient"],"left").select(toy_df.patient.alias("P1"),toy_df.drug.alias('D1'),mdf.patient,mdf.drugs).show()

Я получил ожидаемое поведение

| P1| D1|patient|drugs|
+---+---+-------+-----+
| p2|  a|     p2| null|
| p2|  b|     p2| null|
| p2|  d|     p2| null|
| p1|  a|     p1|    c|
| p1|  b|     p1|    c|
| p1|  c|     p1|    c|
+---+---+-------+-----+

Я идупровести дополнительные исследования и посмотреть, смогу ли я расширить этот первоначальный ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...