У меня здесь сценарий - иметь 30 столбцов в одном dataframe, нужно бросить определенный столбец и выбирать оставшиеся столбцы и поместите его в другое dataframe. Как я могу добиться этого? Я пытался ниже.

val df1: DataFrame = df2.as(a).join( df3.as(b),col(a.key) === col(b.key), inner).drop(a.col1)
.select(" a.star ")

Когда я покажу DF1, его все еще показывают COL1. Любой совет по разрешению этого.

0
Ma28 2 Июн 2021 в 07:51

2 ответа

Лучший ответ

Это действительно так, кажется, вам нужно использовать присоединение «left_semi».

val df1 = df2.drop('col1).join(df3, df2("key") === df3("key"), "left_semi")

Если key - это фактический столбец, вы можете еще больше упростить синтаксис еще больше

val df1 = df2.drop('col1).join(df3, Seq("key"), "left_semi")

Лучший синтаксис зависит от деталей того, как выглядит ваши реальные данные. Если вам нужно обратиться к COL1 в df2 в частности, потому что есть двусмысленность, то используйте df2("col1")

left_semi Присоединения. Возьмите все столбцы из левой таблицы для строк, находящихся в правильном столе.

0
kanielc 2 Июн 2021 в 13:18

drop требует строки без псевдонима таблицы, чтобы вы могли попробовать:

val df1 = df2.as("a")
    .join(df3.as("b"), col("a.key") === col("b.key"), "inner")
    .drop("col1")
    .select("a.*")

Или вместо того, чтобы бросить столбец, вы можете отфильтровать столбцы, которые необходимо выбрать:

val df1 = df2.as("a")
    .join(df3.as("b"), col("a.key") === col("b.key"), "inner")
    .select(df2.columns.filterNot(_ == "col1").map("a." + _): _*)
1
mck 2 Июн 2021 в 08:32