当列名相似时,连接两个PySpark数据框并从一个数据框中获取一些列

rpppsulh  于 2023-02-07  发布在  Spark
关注(0)|答案(1)|浏览(157)

我想连接两个PySpark数据框。但是,我想连接一个数据框中的所有列,以及第二个数据框中的一些列。问题是,两个数据框中有一个名称相似的列。
示例数据框:

# Prepare Data
data_1 = [
    (1, "Italy", "Europe"),
    (2, "Italy", "Europe"),
    (3, "Germany", None),
    (4, "Iran", "Asia"),
    (5, "China", "Asia"),
    (6, "China", None),
    (7, "Japan", "Asia"),
    (8, "France", None),
]

# Create DataFrame
columns = ["Code", "Country", "Continent"]
df_1 = spark.createDataFrame(data=data_1, schema=columns)
df_1.show(truncate=False)

# Prepare Data
data_2 = [
    (1, "Italy", "EUR", 11),
    (2, "Germany", "EUR", 12),
    (3, "China", "CNY", 13),
    (4, "Japan", "JPY", 14),
    (5, "France", "EUR", 15),
    (6, "Taiwan", "TWD", 16),
    (7, "USA", "USD", 17),
    (8, "India", "INR", 18),
]

# Create DataFrame
columns = ["Code", "Country", "Currency", "Sales"]
df_2 = spark.createDataFrame(data=data_2, schema=columns)
df_2.show(truncate=False)

我需要第一个数据框的所有列和第二个数据框的唯一列"货币"。当我使用左联接时:

output = df_1.join(df_2, ["Country"], "left")
output.show()

现在,在Join操作之后,有两个名为"Code"的列。

使用拖放列:

output = df_1.join(df_2, ["Country"], "left").drop('Code', 'Sales')
output.show()

两个名为"Code"的列都被删除。但是,我想保留第一个数据框中的"Code"列。
你知道怎么解决这个问题吗?
另一个问题是如何使"Code"列成为Join操作后生成的DataFrame中最左边的列。

gcuhipw9

gcuhipw91#

如果不需要df_2中的列,可以在连接之前删除它们,如下所示:

output = df_1.join(
    df_2.select('Country', 'Currency'),
    ['Country'], 'left'
)

注意,你也可以通过指定它们来自的 Dataframe 来消除两个同名列的歧义,例如df_1['Code'],所以在你的例子中,在连接之后,你可以使用drop,而不是只保留来自df_1的列和Currency列:

output = df_1\
    .join(df_2, ['Country'], 'left')\
    .select([df_1[c] for c in df_1.columns] + ['Currency'])

相关问题