Странные результаты использования AWS S3 SELECT для получения данных CSV в таблицу SQL
Я написал AWS State Machine в C# для загрузки данных из CSV-файла из S3 Bucket в таблицу базы данных SQL Server, но я получаю действительно странные данные в таблицу.
Две основные функции заключаются в следующем: первая получает полезную нагрузку ответа, вторая разбивает ее на строки, которые затем могут быть вставлены.
private static async Task<ISelectObjectContentEventStream> GetSelectObjectContentEventStream(S3Object s3Object,
AmazonS3Client s3Client, ObjectDefinition definition)
{
var response = await s3Client.SelectObjectContentAsync(new SelectObjectContentRequest()
{
Bucket = s3Object.BucketName,
Key = s3Object.Key,
ExpressionType = ExpressionType.SQL,
Expression = definition.Query,
InputSerialization = new InputSerialization()
{
CSV = new CSVInput()
{
FileHeaderInfo = FileHeaderInfo.Use,
FieldDelimiter = ",",
}
},
OutputSerialization = new OutputSerialization()
{
CSV = new CSVOutput()
{
QuoteFields = QuoteFields.AsNeeded,
FieldDelimiter = ",",
RecordDelimiter = "\r\n"
}
}
});
return response.Payload;
}
Следующая часть - это просто фрагмент кода, который берет полезные данные и помещает их в список строк, чтобы каждая строка могла быть вставлена в базу данных.
foreach (var entity in listResponse.S3Objects.Where(n => n.Key.Contains(definition.FilePrefix)))
{
definition.FileName = entity.Key;
if (entity.Key.Contains(definition.FileExtension))
{
staticDataConsumer.TargetFoundCount++;
context.Logger.LogLine($"entity {entity.Key}");
List<string> lines = new List<string>();
using (var s3Events = await GetSelectObjectContentEventStream(entity, s3Client, definition))
{
foreach (var ev in s3Events)
{
//context.Logger.LogLine($"Received {ev.GetType().Name}!");
if (ev is RecordsEvent records)
{
using (var reader = new StreamReader(records.PayloadEncoding.UTF8))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (line.Length > 0)
{
lines.Add(line);
}
context.Logger.LogLine($"{line}");
}
}
}
}
}
}
}
Когда я выписываю экстракт в журнал CloudWatch или аналогичный, данные выглядят правильно. Вот исходный формат CSV (и я пробовал разные типы контента, text/csv, text/plain, UTF8 и т. Д. Без каких-либо изменений. Я даже пробовал текстовый файл с разделителями-запятыми, та же проблема).
Retail Store,Store Retail Business Manager
105,Kate Fardell
106,Shona Marino
108,Shona Marino
111,Sharon Berger
112,Lina Hannawe
113,Jennifer Hale
114,Paul Dalton
116,Claire Eggbeer
118,Paul Dalton
119,Shona Marino
127,Aydin Tebyanian
128,Cameron Palmer
Вот как выглядят данные при входе в CloudWatch или где-либо еще.
'105','Kate Fardell'
INSERT INTO StaticDataConsumer_RBMReport_csv (RowInsertDateTime,ServerName,RetailStore,RetailBusinessManager) VALUES(GETDATE(),'SDC','105','Kate Fardell')
'106','Shona Marino'
INSERT INTO StaticDataConsumer_RBMReport_csv (RowInsertDateTime,ServerName,RetailStore,RetailBusinessManager) VALUES(GETDATE(),'SDC','106','Shona Marino')
'108','Shona Marino'
INSERT INTO StaticDataConsumer_RBMReport_csv (RowInsertDateTime,ServerName,RetailStore,RetailBusinessManager) VALUES(GETDATE(),'SDC','108','Shona Marino')
'111','Sharon Berger'
INSERT INTO StaticDataConsumer_RBMReport_csv (RowInsertDateTime,ServerName,RetailStore,RetailBusinessManager) VALUES(GETDATE(),'SDC','111','Sharon Berger')
'112','Lina Hannawe'
INSERT INTO StaticDataConsumer_RBMReport_csv (RowInsertDateTime,ServerName,RetailStore,RetailBusinessManager) VALUES(GETDATE(),'SDC','112','Lina Hannawe')
'113','Jennifer Hale'
Однако, когда я проверяю полученную таблицу, данные - каждый символ - имеют пробел между ними и следующим.
RowInsertDateTime RetailStore RetailBusinessManager
----------------------- --------------- ----------------------------------------------------------------------------------------------------
2018-11-01 11:54:38.667 1 0 5 K a t e F a r d e l l
2018-11-01 11:54:38.683 1 0 6 S h o n a M a r i n o
2018-11-01 11:54:38.687 1 0 8 S h o n a M a r i n o
2018-11-01 11:54:38.690 1 1 1 S h a r o n B e r g e r
2018-11-01 11:54:38.690 1 1 2 L i n a H a n n a w e
2018-11-01 11:54:38.693 1 1 3 J e n n i f e r H a l e
2018-11-01 11:54:38.697 1 1 4 P a u l D a l t o n
2018-11-01 11:54:38.700 1 1 6 C l a i r e E g g b e e r
2018-11-01 11:54:38.700 1 1 8 P a u l D a l t o n
2018-11-01 11:54:38.703 1 1 9 S h o n a M a r i n o
2018-11-01 11:54:38.707 1 2 7 A y d i n T e b y a n i a n
Я схожу с ума здесь. Что может быть причиной этого? Я никогда не видел это раньше. Интересно, если я просматриваю данные в SQL Management Studio "Results to Grid", столбцы с разнесенными в них данными отображаются пустыми? Но когда я просматриваю результаты в текст, я вижу записи, но в них есть эти пробелы? Я схожу с ума здесь. Я пробовал.
Установка метаданных другого типа контента для объекта S3, как только он будет в корзине (перечислены типы контента, которые я пробовал ранее в этом посте).
Установка разных типов контента при записи объекта в S3 (например, с помощью объекта записи PowerShell s3).
Попытка сохранить файл как текстовый файл с тем же "содержимым", что и csv, вместо сохранения его как фактического csv.
Без изменений.
Кто-нибудь может помочь? о AWS S3 SELECT не так много онлайн:(