1125 Я столкнулся с той же проблемой. Я сделал следующие изменения на основе этого поста по ответам ROS и комментария ниже в универсальном файле CMakeLists.txt для макроса catkin_packages:
## LIBRARIES: libraries you create in this project that dependent projects also need
Я сделал несколько вещей, чтобы исправить это ...
LIBRARIES agentlib
в макрос catkin_packages
в файле rl_agent/CMakeLists.txt
. Это делает библиотеку agentlib
доступной позже rl_experiment
. LIBRARIES envlib
в макрос catkin_packages
в файле rl_env/CMakeLists.txt
. Это делает библиотеку envlib
позже доступной для rl_experiment
. agentlib
и envlib
из макроса target_link_libraries
в файле rl_experiment/CMakeLists.txt
. Это не обязательно. rl_agent
и rl_env
перечислены в макросе find_package
в rl_experiment/CMakeLists.txt
. ... тогда все успешно скомпилировано.
Используйте компонент вида.
Просто выберите, по каким полям Вы хотите отсортировать свои загруженные строки, и в левом нижнем угле Вы будете видеть флажок для удаления дубликатов. Это поле удаляет любые строки, которые являются дубликатами на основе критериев сортировки только, таким образом, в примере ниже строк считался бы дубликатом, если бы мы только отсортировали на первом поле:
1 | sample A |
1 | sample B |
Я предложил бы использовать SSIS для копирования записей на временную таблицу, затем создал бы задачу, которая использует Отличный Выбор или Разряд в зависимости от ситуации для выбора дубликатов, которые направили бы их к плоскому файлу и удалили бы их из временной таблицы. Последний шаг должен был бы скопировать записи с временной таблицы в конечную таблицу.
Определение дубликата является чем-то, к чему SQL способен, но плоский файл также не подходит для. В случае Вы сделали предложение, контейнер сценария загрузит строку и затем должен был бы сравнить ее с 17 миллионами записей, затем загрузить следующую строку и повторение... Производительность не могла бы быть весь настолько большая.
Стратегия будет обычно зависеть от того, сколько столбцов таблица подготовки имеет. Чем больше столбцов, тем более сложный решение. Статья, которую Вы связали, имеет некоторый очень хороший совет.
Единственная вещь, которую я добавлю к тому, что все другие сказали до сих пор, состоит в том, что столбцы с датой и значениями даты и времени дадут некоторые решения, представленные, здесь соответствует.
Одно решение, которое я предложил, является этим:
SET NOCOUNT ON
DECLARE @email varchar(100)
SET @email = ''
SET @emailid = (SELECT min(email) from StagingTable WITH (NOLOCK) WHERE email > @email)
WHILE @emailid IS NOT NULL
BEGIN
-- Do INSERT statement based on the email
INSERT StagingTable2 (Email)
FROM StagingTable WITH (NOLOCK)
WHERE email = @email
SET @emailid = (SELECT min(email) from StagingTable WITH (NOLOCK) WHERE email > @email)
END
Это НАМНОГО быстрее при выполнении дедупликации, чем КУРСОР и не привяжет ЦП сервера. Для использования этого разделите каждый столбец, который прибывает из текстового файла в их собственные переменные. Используйте отдельный оператор SELECT прежде и в цикле, затем включайте их в оператор INSERT. Это работало действительно хорошо на меня.
Чтобы сделать это на плоском файле, я использую инструмент командной строки Unix, вид:
sort -u inputfile > outputfile
К сожалению, команда вида окон не имеет уникальной опции, но Вы могли попытаться загрузить утилиту сортировки с одного из них:
(Я не судил их, таким образом, никакие гарантии, я боюсь).
С другой стороны, чтобы сделать это как записи загружается в базу данных, Вы могли создать уникальный индекс на ключе таблица базы данных с ignore_dup_key. Это сделает записи уникальными очень эффективно во время загрузки.
CREATE UNIQUE INDEX idx1 ON TABLE (col1, col2, ...) WITH IGNORE_DUP_KEY
Определенное грязное решение состоит в том, чтобы накрыть на Ваш целевой стол с составным ключом, который охватывает все столбцы. Это гарантирует раздутую уникальность. Затем на форме Адресата данных, настройте задачу проигнорировать ошибки. Весь дубликат вставляет, уменьшится в забвение.
Источник плоского файла -> Агрегировать (сгруппировать по столбцам, которые должны быть уникальными) -> Место назначения плоского файла
Я бы порекомендовал загрузить промежуточную таблицу на целевом сервере, а затем объединить результаты в целевую таблицу на целевом сервере. Если вам нужно выполнить какие-либо правила гигиены, вы можете сделать это с помощью хранимой процедуры, поскольку вы обязательно получите лучшую производительность, чем с помощью задач преобразования потока данных SSIS. Кроме того, дедупликация - это, как правило, многоэтапный процесс. Вы можете выполнить дедупликацию на:
.
WITH
sample_records
( email_address
, entry_date
, row_identifier
)
AS
(
SELECT 'tester@test.com'
, '2009-10-08 10:00:00'
, 1
UNION ALL
SELECT 'tester@test.com'
, '2009-10-08 10:00:01'
, 2
UNION ALL
SELECT 'tester@test.com'
, '2009-10-08 10:00:02'
, 3
UNION ALL
SELECT 'the_other_test@test.com'
, '2009-10-08 10:00:00'
, 4
UNION ALL
SELECT 'the_other_test@test.com'
, '2009-10-08 10:00:00'
, 5
)
, filter_records
( email_address
, entry_date
, row_identifier
, sequential_order
, reverse_order
)
AS
(
SELECT email_address
, entry_date
, row_identifier
, 'sequential_order' = ROW_NUMBER() OVER (
PARTITION BY email_address
ORDER BY row_identifier ASC)
, 'reverse_order' = ROW_NUMBER() OVER (
PARTITION BY email_address
ORDER BY row_identifier DESC)
FROM sample_records
)
SELECT email_address
, entry_date
, row_identifier
FROM filter_records
WHERE reverse_order = 1
ORDER BY email_address;
Есть много вариантов для дедупликации файлов, но в конечном итоге я рекомендую обрабатывать это в сохраненном после загрузки промежуточной таблицы на целевой сервер. После очистки данных вы можете СЛИЯТЬ или ВСТАВИТЬ в конечный пункт назначения.
.
WITH
sample_records
( email_address
, entry_date
, row_identifier
)
AS
(
SELECT 'tester@test.com'
, '2009-10-08 10:00:00'
, 1
UNION ALL
SELECT 'tester@test.com'
, '2009-10-08 10:00:01'
, 2
UNION ALL
SELECT 'tester@test.com'
, '2009-10-08 10:00:02'
, 3
UNION ALL
SELECT 'the_other_test@test.com'
, '2009-10-08 10:00:00'
, 4
UNION ALL
SELECT 'the_other_test@test.com'
, '2009-10-08 10:00:00'
, 5
)
, filter_records
( email_address
, entry_date
, row_identifier
, sequential_order
, reverse_order
)
AS
(
SELECT email_address
, entry_date
, row_identifier
, 'sequential_order' = ROW_NUMBER() OVER (
PARTITION BY email_address
ORDER BY row_identifier ASC)
, 'reverse_order' = ROW_NUMBER() OVER (
PARTITION BY email_address
ORDER BY row_identifier DESC)
FROM sample_records
)
SELECT email_address
, entry_date
, row_identifier
FROM filter_records
WHERE reverse_order = 1
ORDER BY email_address;
Есть много вариантов дедупликации файлов, но в конечном итоге я рекомендую обработать это в хранимой процедуре после того, как вы загрузили промежуточную таблицу на целевой сервер. После очистки данных вы можете СЛИЯТЬ или ВСТАВИТЬ в конечный пункт назначения.
.
WITH
sample_records
( email_address
, entry_date
, row_identifier
)
AS
(
SELECT 'tester@test.com'
, '2009-10-08 10:00:00'
, 1
UNION ALL
SELECT 'tester@test.com'
, '2009-10-08 10:00:01'
, 2
UNION ALL
SELECT 'tester@test.com'
, '2009-10-08 10:00:02'
, 3
UNION ALL
SELECT 'the_other_test@test.com'
, '2009-10-08 10:00:00'
, 4
UNION ALL
SELECT 'the_other_test@test.com'
, '2009-10-08 10:00:00'
, 5
)
, filter_records
( email_address
, entry_date
, row_identifier
, sequential_order
, reverse_order
)
AS
(
SELECT email_address
, entry_date
, row_identifier
, 'sequential_order' = ROW_NUMBER() OVER (
PARTITION BY email_address
ORDER BY row_identifier ASC)
, 'reverse_order' = ROW_NUMBER() OVER (
PARTITION BY email_address
ORDER BY row_identifier DESC)
FROM sample_records
)
SELECT email_address
, entry_date
, row_identifier
FROM filter_records
WHERE reverse_order = 1
ORDER BY email_address;
Есть много вариантов дедупликации файлов, но в конечном итоге я рекомендую обработать это в хранимой процедуре после того, как вы загрузили промежуточную таблицу на целевой сервер. После очистки данных вы можете СЛИЯТЬ или ВСТАВИТЬ в конечный пункт назначения.
Найдена эта страница текст ссылки , возможно, стоит посмотреть, хотя с 17 миллионами записей может потребоваться слишком много времени