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

Pyspark:在同一列上联接数据帧时引用不明确

龚永新
2023-03-14

我正在尝试连接两个数据帧。

我创建了别名并根据这篇文章引用它们:Spark Dataframe区分具有重复名称的列

但是,当它点击<code>fillna()s的信息。

alloc_ns = allocation_num_spots.alias('alloc_ns')
avails_ns = avails_num_spots.alias('avails_ns')
compare_num_avails_inv = avails_ns.join(
    alloc_ns, 
        (F.col('avails_ns.BreakDateTime') == F.col('alloc_ns.AllocationDateTime')) & 
        (F.col('avails_ns.RetailUnit') == F.col('alloc_ns.RetailUnit')), 
        how='left').fillna(
    {'allocs_sum': 0}).withColumn(
    'diff', F.col('avails_sum') - F.col('allocs_sum'))

但我一直有这个错误:

"Reference 'RetailUnit' is ambiguous, could be: avails_ns.RetailUnit, alloc_ns.RetailUnit.;"
Traceback (most recent call last):
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/dataframe.py", line 1664, in fillna
    return DataFrame(self._jdf.na().fill(value), self.sql_ctx)
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
    answer, self.gateway_client, self.target_id, self.name)
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: "Reference 'RetailUnit' is ambiguous, could be: avails_ns.RetailUnit, alloc_ns.RetailUnit.;"

下面是连接的输出:

+-------------------+----------+----------+-------------------+----------+----------+
|      BreakDateTime|RetailUnit|avails_sum| AllocationDateTime|RetailUnit|allocs_sum|
+-------------------+----------+----------+-------------------+----------+----------+
|2019-05-09 04:15:00|      CFAB|        60|               null|      null|      null|
|2019-05-09 12:31:00|      CFAB|        60|               null|      null|      null|
|2019-05-09 03:15:00|      CFAB|        60|               null|      null|      null|
|2019-05-09 22:45:00|      CFPK|        60|2019-05-09 22:45:00|      CFPK|       120|
|2019-05-09 00:45:00|      CFPK|       120|2019-05-09 00:45:00|      CFPK|        30|
|2019-05-09 02:31:00|      CFPK|        60|               null|      null|      null|
|2019-05-09 13:45:00|      CFPK|        60|2019-05-09 13:45:00|      CFPK|        30|
|2019-05-09 14:15:00|      CFPK|        60|               null|      null|      null|
|2019-05-09 23:45:00|      CFPK|        60|2019-05-09 23:45:00|      CFPK|       120|
+-------------------+----------+----------+-------------------+----------+----------+

有人可以解释为什么这不起作用吗?我不想创建单独的列,因为它们应该在零售单元上加入。

共有2个答案

周滨海
2023-03-14

您应该重命名重复列

compare_num_avails_inv = (
    avails_ns.join(
      alloc_ns, 
      (F.col('avails_ns.BreakDateTime') == F.col('alloc_ns.AllocationDateTime')) & (F.col('avails_ns.RetailUnit') == F.col('alloc_ns.RetailUnit')), 
      how='left'
    )
    .withColumnRenamed(alloc_ns.RetailUnit, 'RetailUnitNs')
    .fillna({'allocs_sum': 0})
    .withColumn('diff', F.col('avails_sum') - F.col('allocs_sum'))
)

这样,如果需要,您就不需要删除列

酆勇
2023-03-14

使用. drop函数,加入dataframe. drop(alloc_ns.RetailUnit)后删除列

compare_num_avails_inv = avails_ns.join(
    alloc_ns, 
        (F.col('avails_ns.BreakDateTime') == F.col('alloc_ns.AllocationDateTime')) & 
        (F.col('avails_ns.RetailUnit') == F.col('alloc_ns.RetailUnit')), 
        how='left').drop(alloc_ns.RetailUnit).fillna(
    {'allocs_sum': 0}).withColumn(
    'diff', F.col('avails_sum') - F.col('allocs_sum'))

即使我们不是指不明确的列,但 fillna 将遍历列名,然后抛出不明确列的异常

 类似资料:
  • 我在连接两个表时遇到了一些问题: 组:group_id,group_name 学生:学生标识,组标识,名字,姓氏 我想计算每个小组有多少学生,然后输出小组名称,但是当我这样写时: 出现错误“列引用”groupid“不明确”。

  • 使用pyspark数据帧,你如何做相当于熊猫 我想列出pyspark数据框列中的所有唯一值。 不是 SQL 类型方式(注册模板,然后 SQL 查询不同的值)。 此外,我不需要< code>groupby然后< code>countDistinct,而是希望检查该列中的不同值。

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

  • 我有一个完全相同的文件A和B。我试图在这两个数据帧上执行内部和外部连接。因为我将所有的列都作为重复的列,所以现有的答案没有任何帮助。我遇到的其他问题包含一两个重复的列,我的问题是整个文件都是彼此重复的:无论是数据还是列名。 我的代码: 我面临的错误是:

  • 在scala spark中连接不同数据帧时动态选择多列 从上面的链接,我能够让连接表达式工作,但如果列名不同,我们不能使用Seq(columns)而需要动态地连接它。这里的left_ds和right_ds是我想加入的数据流。下面我想要连接列id=acc_id和“acc_no=number”

  • 我正在尝试在 pyspark 中连接两个数据帧,但将一个表作为数组列连接在另一个表上。 例如,对于这些表: 我想在列和上将df1连接到df2,但和应该是单个数组类型列。此外,应保留所有名称。新数据框的输出应该能够转换为此json结构(例如前两行): 任何关于如何实现这一目标的想法都将不胜感激! 谢谢, 卡罗莱纳州