在 Apache Spark (Scala) 上获取两个数据帧的差异
Posted
技术标签:
【中文标题】在 Apache Spark (Scala) 上获取两个数据帧的差异【英文标题】:Getting Difference of two dataframe on Apache Spark (Scala) 【发布时间】:2020-02-18 21:51:34 【问题描述】:我有两个数据帧,它们是 large csv 文件,我正在将它们读入 Spark (Scala) 中的数据帧
第一个数据框类似于
key| col1 | col2 |
-------------------
1 | blue | house |
2 | red | earth |
3 | green| earth |
4 | cyan | home |
第二个数据框类似于
key| col1 | col2 | col3
-------------------
1 | blue | house | xyz
2 | cyan | earth | xy
3 | green| mars | xy
我想为不同数据框中的公共键和公共列(键就像主键)获得这样的差异
key| col1 | col2 |
------------------------------------
1 | blue | house |
2 | red --> cyan | earth |
3 | green | home--> mars |
以下是我目前的做法:
//read the files into dataframe
val src_df = read_df(file1)
val tgt_df = read_df(file2)
//truncate dataframe to only contain common keys
val common_src = spark.sql(
"""
select *
from src_df src
where src.key IN(
select tgt.key
from tgt_df tgt
"""
val tgt_common = spark.sql(
"""
select *
from tgt_df tgt
where tgt.key IN(
select src.key
from src_df src
"""
//merge both the dataframes
val joined_df = src_common.join(tgt_common, src_common(key) === tgt_common(key), "inner")
我尝试做这样的事情没有成功
joined_df
.groupby(key)
.apply(some_function(?))
我尝试查看在线发布的现有解决方案。但我无法得到想要的结果。
PS:也希望该解决方案能够针对大数据进行扩展
谢谢
【问题讨论】:
【参考方案1】:尝试以下方法:
spark.sql(
"""
select
s.id,
if(s.col1 = t.col1, s.col1, s.col1 || ' --> ' || t.col1) as col1,
if(s.col2 = t.col2, s.col2, s.col2 || ' --> ' || t.col2) as col2
from src_df s
inner join tgt_df t on s.id = t.id
""").show
【讨论】:
以上是关于在 Apache Spark (Scala) 上获取两个数据帧的差异的主要内容,如果未能解决你的问题,请参考以下文章
使用 Scala 在 Apache Spark 中连接不同 RDD 的数据集
Apache Spark Python 到 Scala 的翻译