Dataframe 如果未选择任何内容,是否在连接后推送dropDuplicates和select操作?
给定 情景1Dataframe 如果未选择任何内容,是否在连接后推送dropDuplicates和select操作?,dataframe,apache-spark,join,apache-spark-sql,Dataframe,Apache Spark,Join,Apache Spark Sql,给定 情景1 val a = List(1,2,3).toDF("a") val b = List(1,2,3).toDF("b") 情景2 a.filter(col("a").isNull).dropDuplicates().crossJoin(b).show() // display empty data frame as expected 在场景2中,当我从a中选择no列,然后进行交叉连接时,我希望数据帧为空 情景3 val c
val a = List(1,2,3).toDF("a")
val b = List(1,2,3).toDF("b")
情景2
a.filter(col("a").isNull).dropDuplicates().crossJoin(b).show()
// display empty data frame as expected
在场景2中,当我从a
中选择no列,然后进行交叉连接时,我希望数据帧为空
情景3
val c = List().map(a => col(a))
a.select(c:_*).crossJoin(b).show()
// displays
+---+
| b|
+---+
| 1|
| 1|
| 1|
| 2|
| 2|
| 2|
| 3|
| 3|
| 3|
+---+
在场景3中,我再次期望有一个空的数据帧。但是除了结果数据帧不是空的之外,dropDuplicates
似乎发生在场景2中的结果之后
我错过了一些琐碎的事情。选择、加入和删除重复项的顺序是什么?选择与空数据框没有什么不同吗?是因为在执行
a.select(c:*)
时有3个空元素,并且由于交叉联接是笛卡尔联接,所以会给出此结果吗a.select(c:*).count()
return 3这是因为执行a.select(c:*)时有3个空元素,并且由于交叉联接是笛卡尔联接,所以会给出此结果吗a.select(c:*).count()
return 3
val c = List().map(a => col(a))
a.select(c:_*).dropDuplicates().crossJoin(b).show()
// displays
+---+
| b|
+---+
| 1|
| 2|
| 3|
+---+