【发布时间】:2018-06-06 22:43:56
【问题描述】:
我不确定长期工作是否对我这样做,但我在 spark 2.2.0 中看到了一些意想不到的行为
我创建了一个玩具示例,如下所示
toy_df = spark.createDataFrame([
['p1','a'],
['p1','b'],
['p1','c'],
['p2','a'],
['p2','b'],
['p2','d']],schema=['patient','drug'])
我创建另一个数据框
mdf = toy_df.filter(toy_df.drug == 'c')
如你所知,mdf 是
mdf.show()
+-------+----+
|patient|drug|
+-------+----+
| p1| c|
+-------+----+
现在如果我这样做
toy_df.join(mdf,["patient"],"left").select(toy_df.patient.alias("P1"),toy_df.drug.alias('D1'),mdf.patient,mdf.drug).show()
没想到
+---+---+-------+----+
| P1| D1|patient|drug|
+---+---+-------+----+
| p2| a| p2| a|
| p2| b| p2| b|
| p2| d| p2| d|
| p1| a| p1| a|
| p1| b| p1| b|
| p1| c| p1| c|
+---+---+-------+----+
但是如果我使用
toy_df.join(mdf,["patient"],"left").show()
我确实看到了预期的行为
patient|drug|drug|
+-------+----+----+
| p2| a|null|
| p2| b|null|
| p2| d|null|
| p1| a| c|
| p1| b| c|
| p1| c| c|
+-------+----+----+
如果我在其中一个数据帧上使用别名表达式,我会得到预期的行为
toy_df.join(mdf.alias('D'),on=["patient"],how="left").select(toy_df.patient.alias("P1"),toy_df.drug.alias("D1"),'D.drug').show()
| P1| D1|drug|
+---+---+----+
| p2| a|null|
| p2| b|null|
| p2| d|null|
| p1| a| c|
| p1| b| c|
| p1| c| c|
+---+---+----+
所以我的问题是在加入后选择列的最佳方法是什么,这种行为是否正常
编辑:根据 user8371915,这与标记为
Spark SQL performing carthesian join instead of inner join
但我的问题适用于两个具有相同血统并在调用 show 方法时执行连接但连接后的选择列表现不同的数据框。
【问题讨论】:
-
由于
df.col或df['col']的结果是未绑定到数据帧的Column类型,我相信结果是预期的。我想知道为什么您在选择错误的情况下没有收到ambiguous column name错误。 -
一般来说,
DataFrames之间的连接共享相同的血统会导致微不足道的真/假谓词。这种情况应该是自动处理的,但看起来事情在这里漏掉了。诚实的建议 - 始终使用别名。 -
@user8371915 看起来不像是同一个问题。
标签: apache-spark pyspark