当前位置: 首页 > 知识库问答 >
问题:

PySpark dataframe:自联接后使用重复的列名

端木兴国
2023-03-14

我有一个这样的数据帧(受这个问题的启发,设置略有不同):

df3 = hive_context.createDataFrame([
    Row(a=107831, f=3),
    Row(a=107531, f=2),
    Row(a=125231, f=2)
])

基于此,我创建了两个新对象。每个都是原始数据帧的子集:

from pyspark.sql.functions import col

df1 = (df3
  .filter(((col('a') == 107831) & (col('f') == 3))|
          ((col('a') == 125231) & (col('f') == 2))))

df2 = (df3
  .filter(((col('a') == 107831) & (col('f') == 3))|
          ((col('a') == 107531) & (col('f') == 2))))

然后,我想连接这两个数据集,并从每个数据集获取< code>f列,如下所示:

a = (df1
  .join(df2, (df1['a'] == df2['a']), how = 'full')
  .select(df1['f'], df2['f']).collect())

然而,我得到了[行(f=None,f=nones),行(f=2,f=2),行(f=3,f=3)]

而不是所需的< code>[Row(f=3,f=4),Row(f=None,f=2),Row(f=2,f=None)]或表示为表格:

+------+----+------+----+
|     a|   f|     a|   f|
+------+----+------+----+
|107831|   3|107831|   4|
|  null|null|107531|   2|
|125231|   2|  null|null|
+------+----+------+----+

有人知道如何解决这个问题吗?我必须把df1和df2存储在某个地方吗?

当我运行上述链接问题中的场景时,我得到了预期的结果:

df1 = hive_context.createDataFrame([
    Row(a=107831, f=3),
    Row(a=125231, f=2),
])

df2 = hive_context.createDataFrame([
    Row(a=107831, f=4),
    Row(a=107531, f=2),
])

a = df1.join(df2, (df1['a'] == df2['a']), how = 'full').select(df1['f'], df2['f']).collect()
a

我在python 3.6spark 2.3

共有1个答案

平山
2023-03-14

如果有重复的列名,请在数据帧上使用别名以避免歧义:

a = df1.alias('l').join(df2.alias('r'), on='a', how = 'full').select('l.f', 'r.f').collect()
print(a)
#[Row(f=3, f=3), Row(f=None, f=2), Row(f=2, f=None)]
 类似资料:
  • 我有两个数据帧df1(Employee表) 和 在我连接了df1.dept_id和df2.id上的这两个表之后: 同时将其保存在文件中, 它给出错误: 我读过有关使用字符串序列来避免列重复的信息,但这适用于要对其执行连接的列。我需要对未连接的列具有类似的功能。 有没有一种直接的方法可以将重复列嵌入表名以便保存? 我想出了一个解决方案,匹配两个df的列,并重命名重复的列,将表名附加到列名上。但是有直

  • 问题内容: 我目前有一张包含以下记录的表: 其中同一字母表示一些共同的标准(例如,“字母”列的共同值)。我按照以下标准进行自我加入: 此联接提供如下内容: 但是,我只希望每对都包含一次(组合而不是排列)。我将如何获得以下信息: 问题答案: 稍微更改JOIN条件将实现您想要的。 代替: 使用 这将仅包括大于的组合,实际上大于的组合实际上将结果限制为每个组合的一个有效顺序。

  • 我有两张桌子。CategoryMaster和PotentialProject 我想加入typeOfProject和CategoryID。 hibernate中的错误消息是无效的列名TypeOfProject。请给我一些建议。谢谢你。

  • 问题内容: 我有下表: 现在,我想为每个用户创建所有可能的语言对,这意味着我希望结果集为:对于用户1:(2,7),(7,8),(2,8) 对于用户2:(10,3) 为此,我已经完成了以下查询: 我得到的结果是针对用户1的:(2,7),(7,8),(2,8),(7,2),(8,7),(8,2) 对于用户2:(10,3),(3,10) (10,3)和(3,10)对我来说没有区别 如何删除重复的行? t

  • 问题内容: 我有两个表来包含国家/地区的州(state_table)和城市(city_table) 城市表具有state_id以便将其与state_table相关联 两个表中已经有数据。 现在的问题 城市表包含一个州内一个城市的多个条目。另一个城市可能也可能没有相同的城市名称 例如:cityone将在city表中使用stateone出现5次,使用statetwo出现2次 那么,我将如何编写查询以为

  • 问题内容: 我有三个表,每个表都有一个外键。当执行联接时,我得到重复的列。 给定 我的查询语句: 我的目标是从联接中获得所有列的一行,而没有重复的列。那么我应该使用什么SQL语句语法? 问题答案: 默认情况下,如果使用MySQL,MySQL将返回所有表的所有列。您将需要在查询中显式输入列名称,以所需的方式检索它们。使用查询,如下所示: