Одно из предложений может заключаться в том, что вы создаете представление либо в MySql, либо в виде запроса, а затем используете это представление с ограничением записи или указав размер фрагмента в пандах.
Создать ВИДв базе данных:
CREATE VIEW AB_joined AS
SELECT a.applicationNo
,a.sanitizedAccountNum
FROM listA a
LEFT JOIN listB b ON b.applicationNo = a.applicationNo
AND b.sanitizedAccountNum = a.sanitizedAccountNum
WHERE b.applicationNo IS NULL
и используйте query1 в пандах:
query1 = "SELECT * FROM AB_joined"
или используйте просто используйте query2 непосредственно в пандах:
query2 = """
SELECT a.applicationNo
,a.sanitizedAccountNum
FROM listA a
LEFT JOIN listB b ON b.applicationNo = a.applicationNo
AND b.sanitizedAccountNum = a.sanitizedAccountNum
WHERE b.applicationNo IS NULL"""
Затем используйте pandas для чтенияchunksize, вы объединяете разные куски вместе.
result = pd.read_sql_query(query, engine, chunksize=100000)
Более подробную информацию о pandas.read_sql_query можно найти здесь
Еще одно предложение это создать представление непосредственно с sqlalchemy и сделать то, что вы сделали выше.На мой взгляд выбор зависит от цели проекта.Вы можете найти вдохновение для создания представлений в sqlalchemy здесь
Ваш первый вопрос .Я думаю, что запрос должен выглядеть следующим образом:
resultPD = dfA.merge(dfB, left_on="applicationNo", right_on="sanitizedLoanAccount", how="left")
Ваш второй вопрос .Левое соединение - это способ получить только записи из списка A, которых нет в списке B.Вы также используете предложение where, которое добавляет дополнительные правила, для которых следует выбирать строки.
ОБНОВЛЕНИЕ I
Я только что понял, что ваши данные хранятся в виде строк.Не рекомендуется объединять данные в строковых значениях.Если возможно, я бы предложил преобразовать числа, хранящиеся в виде строк, в целые числа.Это может помочь избежать многих проблем.
ОБНОВЛЕНИЕ II - добавлены данные
Я пытался использовать данные, из которых вы сделали снимок экрана.Просто используя два ряда от каждого.
dfA = pd.DataFrame({
'RowID' : [1,2],
'ApplicationNo': ['L0008065026','L000969215'],
'AccountNum': ['34204731277', '006737107100039'],
'SanatizedAccountNum': ['34204731277', '6737107100039']
})
dfB = pd.DataFrame({
'RowID' : [1,2],
'ApplicationNo': ['L43907','L52006'],
'AccountNum': ['3265470064', '073176310000477'],
'SanatizedAccountNum': ['3265470064', '73176310000477']
})
resultPD = dfA.merge(dfB, left_on="ApplicationNo", right_on="SanatizedAccountNum", how="left")
С учетом вышесказанного у меня нет проблем с получением результатаPD.