【发布时间】:2017-02-27 22:25:49
【问题描述】:
数据框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.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。从数据框中“a”行重复。
【问题讨论】:
-
它应该可以正常工作。似乎是调用 unionByName 方法以及填充数据框 c 的位置的问题。
标签: apache-spark apache-spark-sql spark-dataframe