Как отфильтровать записи из объединения двух фреймов данных d1 и d2, где для всего столбца в d1 =! = Весь соответствующий столбец в d2 - PullRequest
0 голосов
/ 28 июня 2018

В основном я хотел проверить, есть ли какие-либо обновленные записи в сравнении нового файла со вчерашним файлом. Например, У меня есть два файла, «файл резервной копии» и «Текущий файл», из которых я создаю два кадра данных, а именно bkpdataframe (псевдоним «bdf») и currentdataframe (псевдоним «cdf»). Ниже приведен код, который я пишу для обновленных записей.

val joined= bdf.join(cdf,Seq("_c0"),"left")

val updatedRecords= joined.filter( (cdf("_c0").isNotNull && ( cdf("_c1") =!= bdf("_c1") || cdf("_c2") =!= bdf("c2"))

Есть ли общий код для проверки всех столбцов. По сути, я не хочу жестко кодировать имя столбца?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

При сравнении двух наборов данных можно установить ограничение, что они должны иметь одинаковую подпись, т. Е. Одинаковый набор столбцов и одинаковый порядок столбцов.

Тогда у вас должны быть объединяющие столбцы в виде списка (jc_list)

Затем вы можете перейти, как показано ниже, чтобы получить желаемый результат:

jc_list1_df = bdf.select (jc_list) jc_list2_df = cdf.select (jc_list)

Затем вы можете сравнить их и создать желаемый результат.

delete_jc_df = jc_list1_df.except (jc_list2_df) --- удаленные записи new_jc_df = jc_list2_df.except (jc_list1_df) --- новые записи

Затем вы можете объединить эти соединяющиеся столбцы с фактическими наборами данных, чтобы получить все остальные столбцы.

delete_df = delete_jc_df.join (BDF, jc_list, "внутренний") insert_df = insert_jc_df.join (CDF, ​​jc_list, "внутренний")

Теперь, если вы хотите найти обновленные записи, вы можете пересечь jc_list1 и jc_list2

jc_list_common = jc_list1.intersect (jc_list2)

теперь вы получаете все остальные столбцы из cdf, используя эти наборы,

* * 1 022 common_df = cdf.join (jc_list_common, jc_list, "внутренний") * +1023 *

теперь вы можете выполнить операцию минус между common_df и bdf, чтобы получить только обновленный набор,

update_df = common_df.minus (bdf) --- вуаля

0 голосов
/ 28 июня 2018

Если ваш dataframe содержит уникальный rows, тогда вы можете использовать функцию except. except функция возвращает записи, которые не похожи в обоих dataframes, как df1-df2

val updatedRecords=bdf.except(cdf).count
if(updatedRecords>0) println("Record updated") else println("Record Not updated")

И если вы хотите найти обновления записей

val updatedRecDF=cdf.except(bdf)
...