在 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) 上获取两个数据帧的差异的主要内容,如果未能解决你的问题,请参考以下文章

在apache spark scala中排序和排名?

使用 Scala 在 Apache Spark 中连接不同 RDD 的数据集

Apache Spark Python 到 Scala 的翻译

无法使用 Scala 在 Apache Spark 中执行用户定义的函数

Scala 中的 Apache Spark 日志记录

使用 IntelliJ idea 的 Scala 工作表作为 Apache Spark 的 Scala REPL