@@ -53,10 +53,63 @@ Status VTVFTableWriter::open(RuntimeState* state, RuntimeProfile* profile) {
5353 _writer_close_timer = ADD_TIMER (writer_profile, " FileWriterCloseTime" );
5454
5555 _file_path = _tvf_sink.file_path ;
56- _max_file_size_bytes = _tvf_sink.__isset .max_file_size_bytes ? _tvf_sink.max_file_size_bytes : 0 ;
56+ _max_file_size_bytes =
57+ _tvf_sink.__isset .max_file_size_bytes ? _tvf_sink.max_file_size_bytes : 0 ;
5758 _delete_existing_files_flag =
5859 _tvf_sink.__isset .delete_existing_files ? _tvf_sink.delete_existing_files : true ;
5960
61+ // Log all parameters received from FE
62+ LOG (INFO) << " TVF table writer open, query_id=" << print_id (_state->query_id ())
63+ << " , tvf_name=" << _tvf_sink.tvf_name
64+ << " , file_path=" << _tvf_sink.file_path
65+ << " , file_format=" << _tvf_sink.file_format
66+ << " , file_type=" << _tvf_sink.file_type
67+ << " , max_file_size_bytes=" << _max_file_size_bytes
68+ << " , delete_existing_files=" << _delete_existing_files_flag;
69+
70+ if (_tvf_sink.__isset .column_separator ) {
71+ LOG (INFO) << " TVF table writer column_separator=[" << _tvf_sink.column_separator << " ]" ;
72+ }
73+ if (_tvf_sink.__isset .line_delimiter ) {
74+ LOG (INFO) << " TVF table writer line_delimiter=[" << _tvf_sink.line_delimiter << " ]" ;
75+ }
76+ if (_tvf_sink.__isset .compression_type ) {
77+ LOG (INFO) << " TVF table writer compression_type=" << _tvf_sink.compression_type ;
78+ }
79+ if (_tvf_sink.__isset .backend_id ) {
80+ LOG (INFO) << " TVF table writer backend_id=" << _tvf_sink.backend_id ;
81+ }
82+
83+ // Log columns info
84+ if (_tvf_sink.__isset .columns ) {
85+ LOG (INFO) << " TVF table writer columns count=" << _tvf_sink.columns .size ();
86+ for (size_t i = 0 ; i < _tvf_sink.columns .size (); i++) {
87+ const auto & col = _tvf_sink.columns [i];
88+ LOG (INFO) << " TVF table writer column[" << i << " ]: name=" << col.column_name
89+ << " , type=" << col.column_type ;
90+ }
91+ } else {
92+ LOG (INFO) << " TVF table writer: no columns info from FE" ;
93+ }
94+
95+ // Log properties
96+ if (_tvf_sink.__isset .properties ) {
97+ LOG (INFO) << " TVF table writer properties count=" << _tvf_sink.properties .size ();
98+ for (const auto & kv : _tvf_sink.properties ) {
99+ LOG (INFO) << " TVF table writer property: " << kv.first << " =" << kv.second ;
100+ }
101+ } else {
102+ LOG (INFO) << " TVF table writer: no properties from FE" ;
103+ }
104+
105+ // Log hadoop config
106+ if (_tvf_sink.__isset .hadoop_config ) {
107+ LOG (INFO) << " TVF table writer hadoop_config count=" << _tvf_sink.hadoop_config .size ();
108+ for (const auto & kv : _tvf_sink.hadoop_config ) {
109+ LOG (INFO) << " TVF table writer hadoop_config: " << kv.first << " =" << kv.second ;
110+ }
111+ }
112+
60113 // Delete existing files if requested
61114 if (_delete_existing_files_flag) {
62115 RETURN_IF_ERROR (_delete_existing_files ());
@@ -66,6 +119,19 @@ Status VTVFTableWriter::open(RuntimeState* state, RuntimeProfile* profile) {
66119}
67120
68121Status VTVFTableWriter::write (RuntimeState* state, vectorized::Block& block) {
122+ if (block.rows () > 0 && _written_rows_counter->value () == 0 ) {
123+ // Log first block structure for debugging
124+ LOG (INFO) << " TVF table writer first block: rows=" << block.rows ()
125+ << " , columns=" << block.columns ()
126+ << " , query_id=" << print_id (_state->query_id ());
127+ for (size_t i = 0 ; i < block.columns (); i++) {
128+ const auto & col_with_name = block.get_by_position (i);
129+ LOG (INFO) << " TVF table writer block column[" << i << " ]: name=" << col_with_name.name
130+ << " , type=" << col_with_name.type ->get_name ()
131+ << " , rows=" << col_with_name.column ->size ();
132+ }
133+ }
134+
69135 COUNTER_UPDATE (_written_rows_counter, block.rows ());
70136
71137 {
@@ -99,31 +165,38 @@ Status VTVFTableWriter::_create_file_writer(const std::string& file_name) {
99165 properties = _tvf_sink.properties ;
100166 }
101167
102- _file_writer_impl = DORIS_TRY (FileFactory::create_file_writer (
103- file_type, _state->exec_env (), {}, properties, file_name,
104- {
105- .write_file_cache = false ,
106- .sync_file_data = false ,
107- }));
168+ LOG (INFO) << " TVF table writer creating file writer: file_name=" << file_name
169+ << " , file_type=" << file_type
170+ << " , properties_count=" << properties.size ()
171+ << " , output_expr_count=" << _vec_output_expr_ctxs.size ();
172+
173+ _file_writer_impl = DORIS_TRY (FileFactory::create_file_writer (file_type, _state->exec_env (), {},
174+ properties, file_name,
175+ {
176+ .write_file_cache = false ,
177+ .sync_file_data = false ,
178+ }));
108179
109180 TFileFormatType::type format = _tvf_sink.file_format ;
110181 switch (format) {
111182 case TFileFormatType::FORMAT_CSV_PLAIN: {
112- std::string column_separator =
183+ _column_separator =
113184 _tvf_sink.__isset .column_separator ? _tvf_sink.column_separator : " ," ;
114- std::string line_delimiter =
185+ _line_delimiter =
115186 _tvf_sink.__isset .line_delimiter ? _tvf_sink.line_delimiter : " \n " ;
116187 TFileCompressType::type compress_type = TFileCompressType::PLAIN;
117188 if (_tvf_sink.__isset .compression_type ) {
118189 compress_type = _tvf_sink.compression_type ;
119190 }
120- _vfile_writer.reset (new VCSVTransformer (_state, _file_writer_impl.get (),
121- _vec_output_expr_ctxs, false , {}, {}, column_separator,
122- line_delimiter, false , compress_type));
191+ LOG (INFO) << " TVF table writer CSV config: column_separator=[" << _column_separator
192+ << " ], line_delimiter=[" << _line_delimiter
193+ << " ], compress_type=" << compress_type;
194+ _vfile_writer.reset (new VCSVTransformer (
195+ _state, _file_writer_impl.get (), _vec_output_expr_ctxs, false , {}, {},
196+ _column_separator, _line_delimiter, false , compress_type));
123197 break ;
124198 }
125199 case TFileFormatType::FORMAT_PARQUET: {
126- // Build parquet schemas from columns
127200 std::vector<TParquetSchema> parquet_schemas;
128201 if (_tvf_sink.__isset .columns ) {
129202 for (const auto & col : _tvf_sink.columns ) {
@@ -132,6 +205,7 @@ Status VTVFTableWriter::_create_file_writer(const std::string& file_name) {
132205 parquet_schemas.push_back (schema);
133206 }
134207 }
208+ LOG (INFO) << " TVF table writer Parquet config: schema_count=" << parquet_schemas.size ();
135209 _vfile_writer.reset (new VParquetTransformer (
136210 _state, _file_writer_impl.get (), _vec_output_expr_ctxs, parquet_schemas, false ,
137211 {TParquetCompressionType::SNAPPY, TParquetVersion::PARQUET_1_0, false , false }));
@@ -142,6 +216,7 @@ Status VTVFTableWriter::_create_file_writer(const std::string& file_name) {
142216 if (_tvf_sink.__isset .compression_type ) {
143217 compress_type = _tvf_sink.compression_type ;
144218 }
219+ LOG (INFO) << " TVF table writer ORC config: compress_type=" << compress_type;
145220 _vfile_writer.reset (new VOrcTransformer (_state, _file_writer_impl.get (),
146221 _vec_output_expr_ctxs, " " , {}, false ,
147222 compress_type));
@@ -151,8 +226,7 @@ Status VTVFTableWriter::_create_file_writer(const std::string& file_name) {
151226 return Status::InternalError (" Unsupported TVF sink file format: {}" , format);
152227 }
153228
154- LOG (INFO) << " TVF table writer created file: " << file_name
155- << " , format: " << format
229+ LOG (INFO) << " TVF table writer created file: " << file_name << " , format: " << format
156230 << " , query_id: " << print_id (_state->query_id ());
157231
158232 return _vfile_writer->open ();
0 commit comments