You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by zh...@apache.org on 2020/02/20 13:06:56 UTC
[incubator-doris] branch master updated: Fix bug: Error of
exporting double type data to hdfs (#2924) (#2925)
This is an automated email from the ASF dual-hosted git repository.
zhaoc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new ccc3412 Fix bug: Error of exporting double type data to hdfs (#2924) (#2925)
ccc3412 is described below
commit ccc3412f13a05ad945d37fd2ac6645c1e2161a98
Author: wutiangan <wu...@gmail.com>
AuthorDate: Thu Feb 20 21:06:50 2020 +0800
Fix bug: Error of exporting double type data to hdfs (#2924) (#2925)
---
be/src/runtime/export_sink.cpp | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/be/src/runtime/export_sink.cpp b/be/src/runtime/export_sink.cpp
index aaf288f..cf5c4ff 100644
--- a/be/src/runtime/export_sink.cpp
+++ b/be/src/runtime/export_sink.cpp
@@ -141,12 +141,29 @@ Status ExportSink::gen_row_buffer(TupleRow* row, std::stringstream* ss) {
case TYPE_LARGEINT:
(*ss) << reinterpret_cast<PackedInt128*>(item)->value;
break;
- case TYPE_FLOAT:
- (*ss) << *static_cast<float*>(item);
+ case TYPE_FLOAT: {
+ char buffer[MAX_FLOAT_STR_LENGTH + 2];
+ float float_value = *static_cast<float*>(item);
+ buffer[0] = '\0';
+ int length = FloatToBuffer(float_value, MAX_FLOAT_STR_LENGTH, buffer);
+ DCHECK(length >= 0) << "gcvt float failed, float value=" << float_value;
+ (*ss) << buffer;
break;
- case TYPE_DOUBLE:
- (*ss) << *static_cast<double*>(item);
+ }
+ case TYPE_DOUBLE: {
+ // To prevent loss of precision on float and double types,
+ // they are converted to strings before output.
+ // For example: For a double value 27361919854.929001,
+ // the direct output of using std::stringstream is 2.73619e+10,
+ // and after conversion to a string, it outputs 27361919854.929001
+ char buffer[MAX_DOUBLE_STR_LENGTH + 2];
+ double double_value = *static_cast<double*>(item);
+ buffer[0] = '\0';
+ int length = DoubleToBuffer(double_value, MAX_DOUBLE_STR_LENGTH, buffer);
+ DCHECK(length >= 0) << "gcvt double failed, double value=" << double_value;
+ (*ss) << buffer;
break;
+ }
case TYPE_DATE:
case TYPE_DATETIME: {
char buf[64];
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org