/// <summary> /// Carga una sentencia <see cref="SentenceExportParquet"/> /// </summary> private SentenceBase LoadSentenceExportParquet(MLNode rootML) { SentenceExportParquet sentence = new SentenceExportParquet(); // Asigna las propiedades básicas sentence.Source = rootML.Attributes[TagSource].Value.TrimIgnoreNull(); sentence.FileName = rootML.Attributes[TagFileName].Value.TrimIgnoreNull(); sentence.Command = GetProviderCommand(rootML, TagLoad); sentence.RecordsPerBlock = rootML.Attributes[TagBatchSize].Value.GetInt(BatchSizeDefault); sentence.RowGroupSize = rootML.Attributes[TagRowGroupSize].Value.GetInt(45_000); sentence.Timeout = GetTimeout(rootML, TimeSpan.FromHours(2)); // Devuelve la sentencia return(sentence); }
/// <summary> /// Procesa una exportación de una consulta a un archivo parquet /// </summary> internal bool Execute(SentenceExportParquet sentence) { string fileName = Processor.Manager.Step.Project.GetFullFileName(sentence.FileName); bool exported = false; // Procesa la sentencia using (BlockLogModel block = Processor.Manager.Logger.Default.CreateBlock(LogModel.LogType.Info, $"Start exporting to '{fileName}'")) { if (string.IsNullOrWhiteSpace(sentence.Command.Sql)) { block.Error("There is not command at export sentence"); } else { ProviderModel provider = Processor.GetProvider(sentence.Source); if (provider == null) { block.Error($"Can't find the provider. Key: '{sentence.Source}'"); } else { CommandModel command = Processor.ConvertProviderCommand(sentence.Command, out string error); if (!string.IsNullOrWhiteSpace(error)) { block.Error($"Error when convert export command. {error}"); } else { try { // Exporta al archivo Export(block, fileName, provider, command, sentence); // Indica que se ha exportado correctamente exported = true; } catch (Exception exception) { block.Error($"Error when export to '{fileName}'", exception); } } } } } // Devuelve el valor que indica si se ha exportado correctamente return(exported); }
/// <summary> /// Exporta los datos a un archivo Parquet /// </summary> private void Export(BlockLogModel block, string fileName, ProviderModel provider, CommandModel command, SentenceExportParquet sentence) { using (System.Data.IDataReader reader = provider.OpenReader(command, sentence.Timeout)) { long records = 0; // Crea el directorio LibHelper.Files.HelperFiles.MakePath(System.IO.Path.GetDirectoryName(fileName)); // Escribe en el archivo records = GetDataWriter(fileName, sentence.RecordsPerBlock, block).Write(reader, sentence.RowGroupSize); // Log block.Info($"Exported {records:#,##0} records"); } }