Dask позволяет вам использовать панды непосредственно для операций, которые являются построчными (например, такими) или могут применяться по одному разделу за раз. Помните, что фрейм данных Dask состоит из набора фреймов данных Pandas.
Для случая с Пандами вы должны сделать это, основываясь на связанных вопросах:
df = pd.DataFrame([["A", "Z,Y"], ["B", "X"], ["C", "W,U,V"]],
columns=['var1', 'var2'])
df.drop('var2', axis=1).join(
df.var2.str.split(',', expand=True).stack().reset_index(drop=True, level=1).rename('var2'))
, поэтому для Dask вы можете применить точно такой же метод через map_partitions
, потому что каждая строка не зависит от всех остальных. , Возможно, это выглядело бы чище, если бы переданная функция была записана отдельно, а не как лямбда:
d = dd.from_pandas(df, 2)
d.map_partitions(
lambda df: df.drop('var2', axis=1).join(
df.var2.str.split(',', expand=True).stack().reset_index(drop=True, level=1).rename('var2')))
, если бы вы сделали .compute()
для этого, вы бы получили точно такой же результат, как и для случая Панд. выше. Скорее всего, вы не захотите вычислить ваш массивный фрейм данных за один раз, но выполните дальнейшую обработку на нем.
UPDATE
Employees E
SET
E.LeadCount = (
SELECT COUNT(L.EmployeeID)
FROM Leads L
WHERE L.EmployeeID = E.EmployeeID
)
Вы собираетесь для проблемы синхронизации данных. Поскольку строки в таблице Leads вставлены, обновлены или удалены, необходимо обновить Сотрудников. Столбец LeadCount постоянно.
Лучшее решение не состояло бы в том, чтобы сохранить столбец LeadCount вообще, но повторно вычислить, количество ведет с агрегатным запросом SQL, поскольку Вам нужно значение. Тем путем это всегда будет корректно.
SELECT employeeID, COUNT(leadId) AS LeadCount
FROM Leads
GROUP BY employeeID;
Другое решение состоит в том, чтобы создать, включает таблицу Leads для ВСТАВКИ, ОБНОВЛЕНИЯ, и УДАЛИТЕ, так, чтобы Вы сохранили Сотрудников. Столбец LeadCount, текущий все время. Например, использование MySQL инициировало синтаксис:
CREATE TRIGGER leadIns AFTER INSERT ON Leads
FOR EACH ROW BEGIN
UPDATE Employees SET LeadCount = LeadCount + 1 WHERE employeeID = NEW.employeeID;
END
CREATE TRIGGER leadIns AFTER UPDATE ON Leads
FOR EACH ROW BEGIN
UPDATE Employees SET LeadCount = LeadCount - 1 WHERE employeeID = OLD.employeeID;
UPDATE Employees SET LeadCount = LeadCount + 1 WHERE employeeID = NEW.employeeID;
END
CREATE TRIGGER leadIns AFTER DELETE ON Leads
FOR EACH ROW BEGIN
UPDATE Employees SET LeadCount = LeadCount - 1 WHERE employeeID = OLD.employeeID;
END
Другая опция при использовании MySQL состоит в том, чтобы использовать синтаксис мультитаблицы UPDATE. Это - расширение MySQL SQL, это не портативно другим брендам RDBMS. Во-первых, сбросьте LeadCount во всех строках для обнуления, затем сделайте соединение к таблице Leads и увеличьте LeadCount в каждой строке, произведенной соединением.
UPDATE Employees SET LeadCount = 0;
UPDATE Employees AS e JOIN Leads AS l USING (employeeID)
SET e.LeadCount = e.LeadCount+1;
Соединения работают то же на обновления (и удаляет) точно так же, как они делают для выборов (редактирование: в некотором популярном RDBMS, по крайней мере, *):
UPDATE Employees SET
LeadCount = Leads.LeadCount
FROM Employee
JOIN (
SELECT EmployeeId, COUNT(*) as LeadCount
FROM Leads
GROUP BY EmployeeId
) as Leads ON
Employee.EmployeeId = Leads.EmployeeId
СУММА (ОТЛИЧНЫЙ EmployeeId) не имеет никакого смысла - Вам просто нужно КОЛИЧЕСТВО (*).
Покрытие сталью сверху и удаление зависимого подзапроса.
// create tmp -> TBL (EmpID, count)
insert into TBL
SELECT employeeID COUNT(employeeID) Di
FROM Leads WHERE Leads.employeeId = Employees.employeeId GROUP BY EmployeeId
UPDATE Employees SET LeadCount = (
SELECT count FROM TBL WHERE TBL.EmpID = Employees.employeeId
)
// drop TBL
РЕДАКТИРОВАНИЕ Это - "группа" не "отличный": b (благодарит Mark Brackett),
UPDATE Employees SET LeadCount = (
SELECT Distinct(SUM(employeeID)) FROM Leads WHERE Leads.employeeId = Employees.employeeId
)