Apache spark 当过滤器应用于Spark中的DF(由2个DF和x27的并集)时,它不能按预期工作
数据帧a:Apache spark 当过滤器应用于Spark中的DF(由2个DF和x27的并集)时,它不能按预期工作,apache-spark,apache-spark-sql,spark-dataframe,Apache Spark,Apache Spark Sql,Spark Dataframe,数据帧a: SN Hash_id Name 111 11ww11 Airtel 222 null Idea 数据帧b: SN Hash_id Name 333 null BSNL 444 22ee11 Vodafone 按列名称对这些数据帧执行UnionAll,如下所示: def unionByName(a: DataFrame, b: DataFrame): DataFrame = { val columns = a.columns.toSet.intersec
SN Hash_id Name
111 11ww11 Airtel
222 null Idea
数据帧b:
SN Hash_id Name
333 null BSNL
444 22ee11 Vodafone
按列名称对这些数据帧执行UnionAll,如下所示:
def unionByName(a: DataFrame, b: DataFrame): DataFrame = {
val columns = a.columns.toSet.intersect(b.columns.toSet).map(col).toSeq
a.select(columns: _*).unionAll(b.select(columns: _*))
}
结果是:数据帧c
SN Hash_id Name
111 11ww11 Airtel
222 null Idea
333 null BSNL
444 22ee11 Vodafone
对数据帧c执行筛选
val withHashDF = c.where(c("Hash_id").isNotNull)
val withoutHashDF = c.where(c("Hash_id").isNull)
使用hashdf的的结果是:它只给出数据帧a的结果
111 11ww11 Airtel
数据帧b的记录表单缺失,其中哈希id存在:
444 22ee11 Vodafone
不带hashdf的的结果是:
222 null Idea
BSNL 333 null
null 222 Idea
在此DF中,列值与列名不同,计数为3,其中应仅为2。从数据帧开始,“a”行重复。查看unionByName
在获取列时有一个小的变化
从
val columns = a.columns.toSet.intersect(b.columns.toSet).map(col).toSeq
到
那么它应该像预期的那样工作
查看下面完整的代码片段和结果:
import sparkSession.sqlContext.implicits._
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.Column
val dataFrameA = Seq(("111", "11ww11", "Airtel"),("222", null, "Idea")).toDF("SN","Hash_id", "Name")
val dataFrameB = Seq(("333", null, "BSNL"),("444", "22ee11", "Vodafone")).toDF("SN","Hash_id", "Name")
def unionByName(a: DataFrame, b: DataFrame): DataFrame = {
val columns = a.columns.intersect(b.columns).map(row => new Column(row)).toSeq
a.select(columns: _*).union(b.select(columns: _*))
}
val dataFrameC = unionByName(dataFrameA, dataFrameB)
val withHashDF = dataFrameC.where(dataFrameC("Hash_id").isNotNull)
val withoutHashDF = dataFrameC.where(dataFrameC("Hash_id").isNull)
println("dataFrameC")
dataFrameC.show()
println("withHashDF")
withHashDF.show
println("withoutHashDF")
withoutHashDF.show
输出:
dataFrameC
+---+-------+--------+
| SN|Hash_id| Name|
+---+-------+--------+
|111| 11ww11| Airtel|
|222| null| Idea|
|333| null| BSNL|
|444| 22ee11|Vodafone|
+---+-------+--------+
withHashDF
+---+-------+--------+
| SN|Hash_id| Name|
+---+-------+--------+
|111| 11ww11| Airtel|
|444| 22ee11|Vodafone|
+---+-------+--------+
withoutHashDF
+---+-------+----+
| SN|Hash_id|Name|
+---+-------+----+
|222| null|Idea|
|333| null|BSNL|
+---+-------+----+
如果Dataframe(Unionall)中存在重复项,则会为filter或where子句提供意外的结果。使用distinct方法消除重复项后,结果与预期一致。它应该可以正常工作。似乎是调用unionByName方法和填充dataframe c的位置的问题。更改unionByName后,在我的示例中,结果也不正确。我怀疑有人在读下流小说。但不知道该如何处理。
dataFrameC
+---+-------+--------+
| SN|Hash_id| Name|
+---+-------+--------+
|111| 11ww11| Airtel|
|222| null| Idea|
|333| null| BSNL|
|444| 22ee11|Vodafone|
+---+-------+--------+
withHashDF
+---+-------+--------+
| SN|Hash_id| Name|
+---+-------+--------+
|111| 11ww11| Airtel|
|444| 22ee11|Vodafone|
+---+-------+--------+
withoutHashDF
+---+-------+----+
| SN|Hash_id|Name|
+---+-------+----+
|222| null|Idea|
|333| null|BSNL|
+---+-------+----+