Получение разности двух данных на Apache Spark (Scala) - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть два фрейма данных, которые большие 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 Ответ

1 голос
/ 19 февраля 2020

Попробуйте следующее:

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
...