Как избежать дублирования имени ключевого столбца в соединении?

avatar
zesla
8 августа 2021 в 17:21
86
3
2

Я пытаюсь соединить две таблицы в spark sql. Каждая таблица имеет более 50 столбцов. Оба имеют столбец id в качестве ключа.

spark.sql("select * from tbl1 join tbl2 on tbl1.id = tbl2.id")

В объединенной таблице есть дублированный столбец id. Конечно, мы можем указать, какой столбец id сохранить, как показано ниже:

.
spark.sql("select tbl1.id, .....from tbl1 join tbl2 on tbl1.id = tbl2.id")

Но так как у нас так много столбцов в обеих таблицах, я не хочу вводить имена всех остальных столбцов в приведенном выше запросе. (кроме столбца id, других повторяющихся имен столбцов нет).

что мне делать? спасибо.

Источник

Ответы (3)

avatar
meniluca
9 августа 2021 в 15:29
0
val joined = spark
     .sql("select * from tbl1")
     .join(
          spark.sql("select * from tbl2"),
          Seq("id"),
          "inner" // optional
     )

joined должен иметь только один столбец id. Протестировано со Spark 2.4.8

avatar
MaestroGlanz
8 августа 2021 в 19:31
0

Предполагая, что вы хотите сохранить "дубликаты", вы можете попробовать использовать внутренний идентификатор строки или эквиваленты для вашей помощи. Это помогало мне в прошлом, если мне приходилось удалять только одну из двух идентичных строк.

select *,ctid from table;

выводит в postgresql также внутренний идентификатор счетчика. Ваши ранее точно идентичные строки теперь становятся другими. Я не знаю насчет spark.sql, но предполагаю, что там можно получить доступ к подобному атрибуту.

avatar
Gordon Linoff
8 августа 2021 в 17:45
2

Если id является единственным общим именем столбца, вы можете воспользоваться предложением USING:

spark.sql("select * from tbl1 join tbl2 using (id) ")

Предложение using соответствует столбцам с одинаковыми именами в обеих таблицах. При использовании select * столбец появляется только один раз.

zesla
8 августа 2021 в 20:02
0

Undefined function: 'using' В Spark SQL нет пункта using. @Гордон Линофф

Gordon Linoff
8 августа 2021 в 21:33
0

@зесла. . . Это может быть версия, которую вы используете. Определенно есть пункт using: spark.apache.org/docs/latest/….

Jacek Laskowski
9 августа 2021 в 11:04
0

Работал нормально в 3.1.2. Благодарю вас!