You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/05/11 12:04:50 UTC

[iotdb] branch master updated: [IOTDB-3143] Potential bug fix for library-udf (#5857)

This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 542ba05ee4 [IOTDB-3143] Potential bug fix for library-udf (#5857)
542ba05ee4 is described below

commit 542ba05ee4a3bdd221ad186ec53f4edfe3139f05
Author: Pengyu Chen <48...@users.noreply.github.com>
AuthorDate: Wed May 11 20:04:45 2022 +0800

    [IOTDB-3143] Potential bug fix for library-udf (#5857)
    
    Co-authored-by: Steve Yurong Su <ro...@apache.org>
---
 library-udf/pom.xml                                |  5 ++++
 .../apache/iotdb/library/dprofile/UDTFPACF.java    |  2 +-
 .../org/apache/iotdb/library/dprofile/UDTFQLB.java |  2 +-
 .../iotdb/library/dprofile/util/MADSketch.java     | 12 ++++++--
 .../iotdb/library/dprofile/util/Resampler.java     | 17 -----------
 .../library/dquality/util/TimeSeriesQuality.java   | 30 +-------------------
 .../apache/iotdb/library/drepair/util/ARFill.java  | 19 +++++++------
 .../iotdb/library/drepair/util/LikelihoodFill.java |  8 +++---
 .../iotdb/library/drepair/util/LsGreedy.java       |  5 ----
 .../apache/iotdb/library/drepair/util/Screen.java  |  5 ----
 .../iotdb/library/drepair/util/ScreenFill.java     |  3 +-
 .../library/drepair/util/TimestampRepair.java      | 33 ++++++++++++++++++----
 .../iotdb/library/drepair/util/ValueFill.java      |  9 ++++--
 .../iotdb/library/drepair/util/ValueRepair.java    | 26 -----------------
 .../iotdb/library/frequency/util/FFTUtil.java      |  8 +++++-
 .../iotdb/library/util/LinearRegression.java       |  8 ++++++
 .../java/org/apache/iotdb/library/util/Util.java   |  8 +++---
 17 files changed, 86 insertions(+), 114 deletions(-)

diff --git a/library-udf/pom.xml b/library-udf/pom.xml
index eae0d16b1b..bc0cdf6c05 100644
--- a/library-udf/pom.xml
+++ b/library-udf/pom.xml
@@ -64,6 +64,11 @@
             <artifactId>commons-lang3</artifactId>
             <version>3.9</version>
         </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>${log4j.version}</version>
+        </dependency>
         <!-- TimeStampRepair -->
         <dependency>
             <groupId>gov.nist.math</groupId>
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFPACF.java b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFPACF.java
index fa92dc1135..e9622ee2fb 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFPACF.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFPACF.java
@@ -77,7 +77,7 @@ public class UDTFPACF implements UDTF {
     n = value.size();
     if (n > 1) {
       if (lag < 0 || lag > value.size() - 1) {
-        lag = (int) Math.min(10 * Math.log10(value.size()), value.size() - 1);
+        lag = Math.min((int) (10 * Math.log10(value.size())), value.size() - 1);
       }
       double[] x =
           Arrays.stream(value.toArray(new Double[0])).mapToDouble(Double::valueOf).toArray();
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFQLB.java b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFQLB.java
index 953fb2edb9..f213ef824b 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFQLB.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/UDTFQLB.java
@@ -89,7 +89,7 @@ public class UDTFQLB implements UDTF {
         }
       }
       correlation = correlation / n;
-      collector.putDouble(n + shift, correlation);
+      collector.putDouble((long) n + shift, correlation);
       qlb += correlation * correlation / (n - shift) * n * (n + 2);
       ChiSquaredDistribution qlbdist = new ChiSquaredDistribution(shift);
       double qlbprob = 1.0 - qlbdist.cumulativeProbability(qlb);
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/MADSketch.java b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/MADSketch.java
index 76bad325f0..ab8bca6dfa 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/MADSketch.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/MADSketch.java
@@ -19,6 +19,8 @@
 package org.apache.iotdb.library.dprofile.util;
 
 import org.eclipse.collections.impl.map.mutable.UnifiedMap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Arrays;
 import java.util.Comparator;
@@ -40,6 +42,8 @@ public class MADSketch {
 
   private static final double MIN_POSITIVE_VALUE = 1e-6;
 
+  private static final Logger logger = LoggerFactory.getLogger(MADSketch.class);
+
   public MADSketch(double alpha) {
     this.alpha = alpha;
 
@@ -86,7 +90,7 @@ public class MADSketch {
       buckets[i++] =
           new Bucket(
               e.getKey(),
-              Math.pow(gamma, e.getKey() - 1),
+              Math.pow(gamma, (double) e.getKey() - 1.0),
               Math.pow(gamma, e.getKey()),
               e.getValue());
     }
@@ -95,7 +99,7 @@ public class MADSketch {
           new Bucket(
               e.getKey(),
               -Math.pow(gamma, e.getKey()),
-              -Math.pow(gamma, e.getKey() - 1),
+              -Math.pow(gamma, (double) e.getKey() - 1.0),
               e.getValue());
     }
     if (zero_count > 0) {
@@ -261,7 +265,9 @@ public class MADSketch {
 
   public void show(Bucket[] buckets) {
     for (Bucket bucket : buckets) {
-      System.out.println(bucket.index + ": " + bucket.count);
+      if (logger.isDebugEnabled()) {
+        logger.debug(bucket.index + ": " + bucket.count);
+      }
     }
   }
 
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/Resampler.java b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/Resampler.java
index 2aae16d3c8..3c347e3879 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/Resampler.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/dprofile/util/Resampler.java
@@ -26,12 +26,6 @@ import org.apache.iotdb.library.util.LongCircularQueue;
 import org.eclipse.collections.impl.list.mutable.primitive.DoubleArrayList;
 import org.eclipse.collections.impl.list.mutable.primitive.LongArrayList;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Scanner;
-
 /** util for UDTFResample. */
 public class Resampler {
 
@@ -85,17 +79,6 @@ public class Resampler {
     valueWindow.add(value);
   }
 
-  /** insert points from a file */
-  public void insert(String filename) throws FileNotFoundException, ParseException {
-    Scanner sc = new Scanner(new File(filename));
-    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-    sc.useDelimiter("\\s*(,|\\r|\\n)\\s*"); // delimited by ',' or '\n', may contains ' ' nearby.
-    sc.nextLine();
-    while (sc.hasNext()) {
-      insert(format.parse(sc.next()).getTime(), sc.nextDouble());
-    }
-  }
-
   /** process all data in buffer */
   public void flush() {
     do { // process data in the last window in first cycle
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/dquality/util/TimeSeriesQuality.java b/library-udf/src/main/java/org/apache/iotdb/library/dquality/util/TimeSeriesQuality.java
index dfc31d21f6..2734413d66 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/dquality/util/TimeSeriesQuality.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/dquality/util/TimeSeriesQuality.java
@@ -25,10 +25,7 @@ import org.apache.iotdb.library.util.Util;
 
 import org.apache.commons.math3.stat.descriptive.rank.Median;
 
-import java.io.File;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Scanner;
 
 /** Class for computing data quality index. */
 public class TimeSeriesQuality {
@@ -53,32 +50,7 @@ public class TimeSeriesQuality {
       Row row = dataIterator.next();
       cnt++;
       double v = Util.getValueAsDouble(row);
-      double t = Long.valueOf(row.getTime()).doubleValue();
-      if (Double.isFinite(v)) {
-        timeList.add(t);
-        originList.add(v);
-      } else { // processing NAN,INF
-        specialCnt++;
-        timeList.add(t);
-        originList.add(Double.NaN);
-      }
-    }
-    time = Util.toDoubleArray(timeList);
-    origin = Util.toDoubleArray(originList);
-    processNaN();
-  }
-
-  public TimeSeriesQuality(String filename) throws Exception {
-    Scanner sc = new Scanner(new File(filename));
-    ArrayList<Double> timeList = new ArrayList<>();
-    ArrayList<Double> originList = new ArrayList<>();
-    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-    sc.useDelimiter("\\s*(,|\\r|\\n)\\s*"); // set separator
-    sc.nextLine();
-    while (sc.hasNext()) {
-      cnt++;
-      double t = format.parse(sc.next()).getTime();
-      double v = sc.nextDouble();
+      double t = (double) row.getTime();
       if (Double.isFinite(v)) {
         timeList.add(t);
         originList.add(v);
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ARFill.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ARFill.java
index 90e5b7c783..cc362cbfe4 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ARFill.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ARFill.java
@@ -19,6 +19,7 @@
 package org.apache.iotdb.library.drepair.util;
 
 import org.apache.iotdb.db.query.udf.api.access.RowIterator;
+import org.apache.iotdb.db.query.udf.api.exception.UDFException;
 
 public class ARFill extends ValueFill {
   // TODO Higer order AR regression
@@ -35,7 +36,7 @@ public class ARFill extends ValueFill {
   }
 
   @Override
-  public void fill() {
+  public void fill() throws UDFException {
     // compute \sum x_t * x_{t-1}
     double acf = 0;
     double factor = 0;
@@ -52,16 +53,13 @@ public class ARFill extends ValueFill {
       factor += left * left;
       acf_cnt += 1;
     }
-    //        acf /= acf_cnt;
-    this.theta = acf / factor;
-    try {
-      assert this.theta < 1;
-    } catch (AssertionError e) {
-      System.out.println("Cannot fit AR(1) model. Please try another method.");
+    if (factor == 0d || this.theta >= 1) {
       this.time = new long[] {0};
       this.repaired = new double[] {0D};
-      return;
+      throw new UDFException("Cannot fit AR(1) model. Please try another method.");
     }
+    // acf /= acf_cnt;
+    this.theta = acf / factor;
     double mean_epsilon = 0;
     double var_epsilon = 0;
     double cnt_epsilon = 0;
@@ -75,6 +73,11 @@ public class ARFill extends ValueFill {
       mean_epsilon += epsilon;
       var_epsilon += epsilon * epsilon;
     }
+    if (cnt_epsilon == 0d) {
+      this.time = new long[] {0};
+      this.repaired = new double[] {0D};
+      throw new UDFException("Cannot fit AR(1) model. Please try another method.");
+    }
     mean_epsilon /= cnt_epsilon;
     var_epsilon /= cnt_epsilon;
     for (int i = 0; i < original.length; i++) {
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LikelihoodFill.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LikelihoodFill.java
index f293a16734..cc26be1a24 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LikelihoodFill.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LikelihoodFill.java
@@ -71,11 +71,11 @@ public class LikelihoodFill extends ValueFill {
             || Double.isNaN(repaired[currentIndex + 1])) {
           continue;
         }
-        double intervalPrev1 = time[currentIndex] - time[currentIndex - 1];
-        double intervalPost1 = time[currentIndex + 1] - time[currentIndex];
+        double intervalPrev1 = (double) (time[currentIndex] - time[currentIndex - 1]);
+        double intervalPost1 = (double) (time[currentIndex + 1] - time[currentIndex]);
         double squareAPrev = 0.0, squareBPrev = 0.0;
         if (currentIndex >= 2 && !Double.isNaN(repaired[currentIndex - 2])) {
-          double intervalPrev2 = time[currentIndex - 2] - time[currentIndex - 1];
+          double intervalPrev2 = (double) (time[currentIndex - 2] - time[currentIndex - 1]);
           squareAPrev = 1.0 / (intervalPrev1 * intervalPrev1);
           squareBPrev =
               2.0 * repaired[currentIndex - 2] / (intervalPrev2 * intervalPrev1)
@@ -99,7 +99,7 @@ public class LikelihoodFill extends ValueFill {
                     / (intervalPrev1 * intervalPost1 * intervalPost1);
         double squareAPost = 0.0, squareBPost = 0.0;
         if (currentIndex <= n - 3 && !Double.isNaN(repaired[currentIndex + 2])) {
-          double intervalPost2 = time[currentIndex + 2] - time[currentIndex + 1];
+          double intervalPost2 = (double) (time[currentIndex + 2] - time[currentIndex + 1]);
           squareAPost = 1.0 / (intervalPost1 * intervalPost1);
           squareBPost =
               2.0 * repaired[currentIndex + 2] / (intervalPost1 * intervalPost2)
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LsGreedy.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LsGreedy.java
index 276841c76f..21decefc20 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LsGreedy.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/LsGreedy.java
@@ -33,11 +33,6 @@ public class LsGreedy extends ValueRepair {
     setParameters();
   }
 
-  public LsGreedy(String filename) throws Exception {
-    super(filename);
-    setParameters();
-  }
-
   private void setParameters() {
     double[] speed = Util.speed(original, time);
     double[] speedchange = Util.variation(speed);
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/Screen.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/Screen.java
index 9bc3c93c75..8c3877478a 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/Screen.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/Screen.java
@@ -37,11 +37,6 @@ public class Screen extends ValueRepair {
     setParameters();
   }
 
-  public Screen(String filename) throws Exception {
-    super(filename);
-    setParameters();
-  }
-
   private void setParameters() {
     // set the default speed threshold
     double[] speed = Util.speed(original, time);
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ScreenFill.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ScreenFill.java
index 6badf0446f..40131bc9e6 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ScreenFill.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ScreenFill.java
@@ -19,6 +19,7 @@
 package org.apache.iotdb.library.drepair.util;
 
 import org.apache.iotdb.db.query.udf.api.access.RowIterator;
+import org.apache.iotdb.db.query.udf.api.exception.UDFException;
 import org.apache.iotdb.library.util.Util;
 
 import org.apache.commons.lang3.tuple.Pair;
@@ -49,7 +50,7 @@ public class ScreenFill extends ValueFill {
   }
 
   @Override
-  public void calMeanAndVar() {
+  public void calMeanAndVar() throws UDFException {
     super.calMeanAndVar();
   }
 
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampRepair.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampRepair.java
index a6172fb89d..b01e87a56f 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampRepair.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/TimestampRepair.java
@@ -22,6 +22,9 @@ import org.apache.iotdb.db.query.udf.api.access.Row;
 import org.apache.iotdb.db.query.udf.api.access.RowIterator;
 import org.apache.iotdb.library.util.Util;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.util.ArrayList;
 
 public class TimestampRepair {
@@ -33,6 +36,7 @@ public class TimestampRepair {
   protected double[] repairedValue;
   protected long deltaT;
   protected long start0;
+  private static final Logger logger = LoggerFactory.getLogger(TimestampRepair.class);
 
   public TimestampRepair(RowIterator dataIterator, int intervalMode, int startPointMode)
       throws Exception {
@@ -68,7 +72,7 @@ public class TimestampRepair {
       noRepair();
       return;
     }
-    int n_ = (int) Math.ceil((time[n - 1] - start0) / deltaT + 1);
+    int n_ = (int) Math.ceil((time[n - 1] - start0) / (double) deltaT + 1.0);
     repaired = new long[n_];
     repairedValue = new double[n_];
     int m_ = this.n;
@@ -116,12 +120,17 @@ public class TimestampRepair {
     int j = m_;
     double unionSet = 0;
     double joinSet = 0;
+
     while (i >= 1 && j >= 1) {
       long ps = start0 + (i - 1) * deltaT;
       if (steps[i][j] == 0) {
         repaired[i - 1] = ps;
         repairedValue[i - 1] = original[j - 1];
-        System.out.println(time[j - 1] + "," + ps + "," + original[j - 1]);
+        /*
+        if(logger.isDebugEnabled()){
+          logger.debug(time[j - 1] + "," + ps + "," + original[j - 1]);
+        }
+        */
         unionSet += 1;
         joinSet += 1;
         i--;
@@ -131,17 +140,29 @@ public class TimestampRepair {
         repaired[i - 1] = ps;
         repairedValue[i - 1] = Double.NaN;
         unionSet += 1;
-        System.out.println("add, " + ps + "," + original[j - 1]);
+        /*
+        if(logger.isDebugEnabled()){
+          logger.debug("add, " + ps + "," + original[j - 1]);
+        }
+        */
         i--;
       } else {
         // delete points
         unionSet += 1;
-        System.out.println(time[j - 1] + ",delete" + "," + original[j - 1]);
+        /*
+        if(logger.isDebugEnabled()){
+          logger.debug(time[j - 1] + ",delete" + "," + original[j - 1]);
+        }
+        */
         j--;
       }
     }
-    System.out.println(joinSet / unionSet);
-    System.out.println(f[n_][m_] / n_);
+    /*
+    if(logger.isDebugEnabled()) {
+      logger.debug(joinSet / unionSet);
+      logger.debug(f[n_][m_] / n_);
+    }
+     */
   }
 
   public double[] getRepairedValue() {
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueFill.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueFill.java
index b3bdb33eec..1275f960db 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueFill.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueFill.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.library.drepair.util;
 
 import org.apache.iotdb.db.query.udf.api.access.Row;
 import org.apache.iotdb.db.query.udf.api.access.RowIterator;
+import org.apache.iotdb.db.query.udf.api.exception.UDFException;
 import org.apache.iotdb.library.util.Util;
 
 import java.util.ArrayList;
@@ -52,7 +53,7 @@ public abstract class ValueFill {
     repaired = new double[n];
   }
 
-  public abstract void fill();
+  public abstract void fill() throws UDFException;
 
   public long[] getTime() {
     return time;
@@ -62,14 +63,16 @@ public abstract class ValueFill {
     return repaired;
   };
 
-  public void calMeanAndVar() {
+  public void calMeanAndVar() throws UDFException {
     for (double v : original) {
       if (!Double.isNaN(v)) {
         mean += v;
         not_nan_number += 1;
       }
     }
-    assert not_nan_number > 0 : "All values are NaN";
+    if (not_nan_number == 0) {
+      throw new UDFException("All values are NaN");
+    }
     mean /= not_nan_number;
     for (double v : original) {
       if (!Double.isNaN(v)) {
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueRepair.java b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueRepair.java
index 5b47ac776c..0d8f53256a 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueRepair.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/drepair/util/ValueRepair.java
@@ -22,10 +22,7 @@ import org.apache.iotdb.db.query.udf.api.access.Row;
 import org.apache.iotdb.db.query.udf.api.access.RowIterator;
 import org.apache.iotdb.library.util.Util;
 
-import java.io.File;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Scanner;
 
 public abstract class ValueRepair {
 
@@ -54,29 +51,6 @@ public abstract class ValueRepair {
     processNaN();
   }
 
-  public ValueRepair(String filename) throws Exception {
-    Scanner sc = new Scanner(new File(filename));
-    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-    sc.useDelimiter("\\s*(,|\\r|\\n)\\s*");
-    sc.nextLine();
-    ArrayList<Long> timeList = new ArrayList<>();
-    ArrayList<Double> originList = new ArrayList<>();
-    while (sc.hasNext()) {
-      timeList.add(format.parse(sc.next()).getTime());
-      Double v = sc.nextDouble();
-      if (!Double.isFinite(v)) {
-        originList.add(Double.NaN);
-      } else {
-        originList.add(v);
-      }
-    }
-    time = Util.toLongArray(timeList);
-    original = Util.toDoubleArray(originList);
-    n = time.length;
-    repaired = new double[n];
-    processNaN();
-  }
-
   public abstract void repair();
 
   private void processNaN() throws Exception {
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/frequency/util/FFTUtil.java b/library-udf/src/main/java/org/apache/iotdb/library/frequency/util/FFTUtil.java
index e3fde4e7de..848a158794 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/frequency/util/FFTUtil.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/frequency/util/FFTUtil.java
@@ -20,10 +20,14 @@ package org.apache.iotdb.library.frequency.util;
 
 import org.apache.iotdb.db.query.udf.api.collector.PointCollector;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /** Util for UDFFFT */
 public class FFTUtil {
   private final String result;
   private final double compressRate;
+  private static final Logger logger = LoggerFactory.getLogger(FFTUtil.class);
 
   public FFTUtil(String res, double cmprate) {
     this.result = res;
@@ -44,7 +48,9 @@ public class FFTUtil {
       add(collector, a, i);
       temp += (a[2 * i] * a[2 * i] + a[2 * i + 1] * a[2 * i + 1]) * 2;
       if (temp > compressRate * sum) {
-        System.out.println(i);
+        if (logger.isDebugEnabled()) {
+          logger.debug(String.valueOf(i));
+        }
         break;
       }
     }
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/util/LinearRegression.java b/library-udf/src/main/java/org/apache/iotdb/library/util/LinearRegression.java
index d5362a8eef..b79ac7f8c3 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/util/LinearRegression.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/util/LinearRegression.java
@@ -18,6 +18,8 @@
  */
 package org.apache.iotdb.library.util;
 
+import org.apache.iotdb.db.query.udf.api.exception.UDFException;
+
 import java.util.Arrays;
 
 /**
@@ -40,6 +42,9 @@ public class LinearRegression {
     if (x.length != y.length) {
       throw new Exception("Different input array length.");
     }
+    if (x.length == 1) { // cannot do regression
+      throw new Exception("Input series should be longer than 1.");
+    }
     e = new double[n];
     yhead = new double[n];
     sumx = Arrays.stream(x).sum();
@@ -55,6 +60,9 @@ public class LinearRegression {
       yybar += (y[i] - ybar) * (y[i] - ybar);
       xybar += (x[i] - xbar) * (y[i] - ybar);
     }
+    if (xxbar == 0d) {
+      throw new UDFException("All input x are same.");
+    }
     beta1 = xybar / xxbar;
     beta0 = ybar - beta1 * xbar;
     // analyze results
diff --git a/library-udf/src/main/java/org/apache/iotdb/library/util/Util.java b/library-udf/src/main/java/org/apache/iotdb/library/util/Util.java
index 0329628119..0691bd3e19 100644
--- a/library-udf/src/main/java/org/apache/iotdb/library/util/Util.java
+++ b/library-udf/src/main/java/org/apache/iotdb/library/util/Util.java
@@ -200,7 +200,7 @@ public class Util {
     int n = origin.length;
     double[] var = new double[n - 1];
     for (int i = 0; i < n - 1; i++) {
-      var[i] = origin[i + 1] - origin[i];
+      var[i] = (double) (origin[i + 1] - origin[i]);
     }
     return var;
   }
@@ -291,13 +291,13 @@ public class Util {
       unit = 1000;
       s = s.substring(0, s.length() - 1);
     } else if (s.endsWith("m")) {
-      unit = 60 * 1000;
+      unit = 60 * 1000L;
       s = s.substring(0, s.length() - 1);
     } else if (s.endsWith("h")) {
-      unit = 60 * 60 * 1000;
+      unit = 60 * 60 * 1000L;
       s = s.substring(0, s.length() - 1);
     } else if (s.endsWith("d")) {
-      unit = 24 * 60 * 60 * 1000;
+      unit = 24 * 60 * 60 * 1000L;
       s = s.substring(0, s.length() - 1);
     }
     double v = Double.parseDouble(s);