/// <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");
            }
        }