Pyspark:在同一列上连接数据帧时,引用不明确
Pyspark: Reference is ambiguous when joining dataframes on same column
我正在尝试连接两个数据帧。
我创建了别名并根据这个post引用了它们:
但是当它命中 fillna()
函数时,我仍然收到关于不明确列的错误,即使我没有引用任何关于 RetailUnit
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|
+-------------------+----------+----------+-------------------+----------+----------+
有人可以解释为什么这不起作用吗?我不想创建单独的列,因为它们应该加入 RetailUnit
.
使用.drop
函数并在加入数据框后删除列.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
将遍历列名然后抛出 不明确列的异常。
您应该重命名重复的列
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'))
)
这样您就不需要在需要时删除该列
我正在尝试连接两个数据帧。
我创建了别名并根据这个post引用了它们:
但是当它命中 fillna()
函数时,我仍然收到关于不明确列的错误,即使我没有引用任何关于 RetailUnit
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|
+-------------------+----------+----------+-------------------+----------+----------+
有人可以解释为什么这不起作用吗?我不想创建单独的列,因为它们应该加入 RetailUnit
.
使用.drop
函数并在加入数据框后删除列.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
将遍历列名然后抛出 不明确列的异常。
您应该重命名重复的列
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'))
)
这样您就不需要在需要时删除该列