数据框架A:
SN Hash_id Name
111 11ww11 Airtel
222 null Idea
数据框架B:
SN Hash_id Name
333 null BSNL
444 22ee11 Vodafone
按列名在这些数据框上执行联合列,如下:
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)
withHashDF
的结果是:它仅给数据框架a
111 11ww11 Airtel
记录形式的数据框架B缺少存在哈希ID:
444 22ee11 Vodafone
withoutHashDF
的结果是:
222 null Idea
BSNL 333 null
null 222 Idea
在此df中,列值不符合每个列名,计数为3,其中应为2。
看 unionByName
获得columns
从
更改val columns = a.columns.toSet.intersect(b.columns.toSet).map(col).toSeq
to
val columns = a.columns.intersect(b.columns).map(row => new Column(row)).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)中有重复项,则为滤波器或何处给出意外的结果。一旦您使用不同的方法消除了重复项,结果就如预期的。