精华内容
下载资源
问答
  • sqoop 从mysql 导入数据到hive 中 ,如果利用sqoop自动建表,那么mysql 中的decimal到底是对应hive中的double 类型还是string类型。 首先,sqoop 能自动建表并且导入hive 的有两种数据格式 一种是 text file 一种是...

    题目是为了便于搜索,介意者请忽略。

    sqoop 从mysql 导入数据到hive 中 ,如果利用sqoop自动建表,那么mysql 中的decimal到底是对应hive中的double 类型还是string类型。
    首先,sqoop 能自动建表并且导入hive 的有两种数据格式 一种是 text file 一种是parquet ,不能自动建表的我们今天在这里不做讨论。
    如果是以text file导入hive 的话 ,那么decimal 就对应hive中的double
    对应的源码在此

    /**
     * Licensed to the Apache Software Foundation (ASF) under one
     * or more contributor license agreements.  See the NOTICE file
     * distributed with this work for additional information
     * regarding copyright ownership.  The ASF licenses this file
     * to you under the Apache License, Version 2.0 (the
     * "License"); you may not use this file except in compliance
     * with the License.  You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package org.apache.sqoop.hive;
    
    import java.sql.Types;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    /**
     * Defines conversion between SQL types and Hive types.
     */
    public final class HiveTypes {
    
      public static final Log LOG = LogFactory.getLog(HiveTypes.class.getName());
    
      private HiveTypes() { }
    
      /**
       * Given JDBC SQL types coming from another database, what is the best
       * mapping to a Hive-specific type?
       */
      public static String toHiveType(int sqlType) {
    
          switch (sqlType) {
              case Types.INTEGER:
              case Types.SMALLINT:
                  return "INT";
              case Types.VARCHAR:
              case Types.CHAR:
              case Types.LONGVARCHAR:
              case Types.NVARCHAR:
              case Types.NCHAR:
              case Types.LONGNVARCHAR:
              case Types.DATE:
              case Types.TIME:
              case Types.TIMESTAMP:
              case Types.CLOB:
                  return "STRING";
              case Types.NUMERIC:
              case Types.DECIMAL:
              case Types.FLOAT:
              case Types.DOUBLE:
              case Types.REAL:
                  return "DOUBLE";
              case Types.BIT:
              case Types.BOOLEAN:
                  return "BOOLEAN";
              case Types.TINYINT:
                  return "TINYINT";
              case Types.BIGINT:
                  return "BIGINT";
              default:
            // TODO(aaron): Support BINARY, VARBINARY, LONGVARBINARY, DISTINCT,
            // BLOB, ARRAY, STRUCT, REF, JAVA_OBJECT.
            return null;
          }
      }
    
      /**
       * @return true if a sql type can't be translated to a precise match
       * in Hive, and we have to cast it to something more generic.
       */
      public static boolean isHiveTypeImprovised(int sqlType) {
        return sqlType == Types.DATE || sqlType == Types.TIME
            || sqlType == Types.TIMESTAMP
            || sqlType == Types.DECIMAL
            || sqlType == Types.NUMERIC;
      }
    }
    
    
    

    如果是parquet方式导入的话
    那么 decimal 就对应的是string

    /**
       * Resolve a database-specific type to Avro data type.
       * @param sqlType     sql type
       * @return            avro type
       */
      public Type toAvroType(int sqlType) {
        switch (sqlType) {
        case Types.TINYINT:
        case Types.SMALLINT:
        case Types.INTEGER:
          return Type.INT;
        case Types.BIGINT:
          return Type.LONG;
        case Types.BIT:
        case Types.BOOLEAN:
          return Type.BOOLEAN;
        case Types.REAL:
          return Type.FLOAT;
        case Types.FLOAT:
        case Types.DOUBLE:
          return Type.DOUBLE;
        case Types.NUMERIC:
        case Types.DECIMAL:
          return Type.STRING;
        case Types.CHAR:
        case Types.VARCHAR:
        case Types.LONGVARCHAR:
        case Types.LONGNVARCHAR:
        case Types.NVARCHAR:
        case Types.NCHAR:
          return Type.STRING;
        case Types.DATE:
        case Types.TIME:
        case Types.TIMESTAMP:
          return Type.LONG;
        case Types.BLOB:
        case Types.BINARY:
        case Types.VARBINARY:
        case Types.LONGVARBINARY:
          return Type.BYTES;
        default:
          throw new IllegalArgumentException("Cannot convert SQL type "
              + sqlType);
        }
      }
    

    该方法具体的包与类是
    org.apache.sqoop.manager.ConnManager
    其实二者之所以会出现同样的类型在导入到hive中就变得不一样 是
    二者的建表方式不一样
    parquet导入文件的建表方式是(以下是代码中的注释,在此摘抄)
    For Parquet file, the import action will create hive table directly via kite

    代码如下

    /**
       * Import a table or query.
       * @return true if an import was performed, false otherwise.
       */
      protected boolean importTable(SqoopOptions options, String tableName,
          HiveImport hiveImport) throws IOException, ImportException {
        String jarFile = null;
    
        // Generate the ORM code for the tables.
        jarFile = codeGenerator.generateORM(options, tableName);
    
        Path outputPath = getOutputPath(options, tableName);
    
        // Do the actual import.
        ImportJobContext context = new ImportJobContext(tableName, jarFile,
            options, outputPath);
    
        // If we're doing an incremental import, set up the
        // filtering conditions used to get the latest records.
        if (!initIncrementalConstraints(options, context)) {
          return false;
        }
    
        if (options.isDeleteMode()) {
          deleteTargetDir(context);
        }
    
        if (null != tableName) {
          manager.importTable(context);
        } else {
          manager.importQuery(context);
        }
    
        if (options.isAppendMode()) {
          AppendUtils app = new AppendUtils(context);
          app.append();
        } else if (options.getIncrementalMode() == SqoopOptions.IncrementalMode.DateLastModified) {
          lastModifiedMerge(options, context);
        }
    
        // If the user wants this table to be in Hive, perform that post-load.
        if (options.doHiveImport()) {
          // For Parquet file, the import action will create hive table directly via
          // kite. So there is no need to do hive import as a post step again.
          if (options.getFileLayout() != SqoopOptions.FileLayout.ParquetFile) {
            hiveImport.importTable(tableName, options.getHiveTableName(), false);
          }
        }
    
        saveIncrementalState(options);
    
        return true;
      }
    

    从此代码中我们可以看到 parquet 的文件到该方法的时候,应该是已经导入到hive表中了

    展开全文
  • <p>Error: Error while compiling statement: FAILED: SemanticException [Error 10014]: Line 1:12 Wrong arguments 'geometry': Argument 0 must be a number (state=42000,code=...
  • Hive中的DECIMAL类型

    千次阅读 2020-10-29 14:28:34
    Hive中的DECIMAL类型与Java的Big Decimal格式相同。它用于表示不变的任意精度。语法和示例如下: DECIMAL(precision, scale)decimal(10,0) https://mp.weixin.qq.com/s/BUk8Y7-rOiBzUnseekqmGg 1、 基本类型 ...

    (Decimal)小数点

    Hive中的DECIMAL类型与Java的Big Decimal格式相同。它用于表示不变的任意精度。语法和示例如下:

    •  
    DECIMAL(precision, scale)decimal(10,0)

     

    https://mp.weixin.qq.com/s/BUk8Y7-rOiBzUnseekqmGg

    1、 基本类型

     

    这里我们对DECIMAL类型做两点说明:
    1)DECIMAL(9,8)代表最多9位数字,后8位是小数。此时也就是说,小数点前最多有1位数字,如果超过一位则会变成null。
    2)如果不指定参数,那么默认是DECIMAL(10,0),即没有小数位,此时0.82会变成1。

     

    这里我们通过一个SQL来进行说明:

    创建表:

    create table if not existsdatatype_test1(id int,col1 decimal,col2 decimal(9,8)) row format delimited fields terminated by ',';

    我们从txt中读取数据:​​​​​​​

    load data local inpath '/Users/meituan_sxw/Downloads/test1.txt' into table datatype_test1;
    #txt中的内容1,0.82,83.22,1.06,9.22

    接下来查看hive中的数据:

     select * from datatype_test1;

     

    类型转换:

    https://cwiki.apache.org/confluence/display/Hive/Tutorial

    The Types are organized in the following hierarchy (where the parent is a super type of all the children instances):

    • Type
      • Primitive Type

        • Number

          • DOUBLE

            • FLOAT

              • BIGINT

                • INT

                  • SMALLINT

                    • TINYINT

            • STRING

        • BOOLEAN

    This type hierarchy defines how the types are implicitly converted in the query language. Implicit conversion is allowed for types from child to an ancestor. So when a query expression expects type1 and the data is of type2, type2 is implicitly converted to type1 if type1 is an ancestor of type2 in the type hierarchy. Note that the type hierarchy allows the implicit conversion of STRING to DOUBLE.

    Explicit type conversion can be done using the cast operator as shown in the #Built In Functions section below.

     

     

     

     

     

     

     

     

     

    展开全文
  • HIVE decimal类型溢出问题

    千次阅读 2019-09-25 08:22:34
    hive版本1.2.1 s1字段类型为DECIMAL(38,a) s2字段类型为DECIMAL(38,b) s3字段类型为DECIMAL(38,c) s1 * s2* s3结果为NULL,没有报错 解决办法 猜测为hive隐式转换数值型溢出,导致显示为NULL,可通过CAST强制转换...

    背景

    hive版本1.2.1
    s1字段类型为DECIMAL(38,a)
    s2字段类型为DECIMAL(38,b)
    s3字段类型为DECIMAL(38,c)
    s1 * s2* s3结果为NULL,没有报错

    解决办法

    猜测为hive隐式转换数值型溢出,导致显示为NULL,可通过CAST强制转换精度进行处理,如
    CAST((s1 * s2) as DECIMAL(38,d)) * s3

    展开全文
  • <div><p>该提问来源于开源项目:greenplum-db/gpdb</p></div>
  • CREATETABLEIFNOTEXISTS test_decimal( md5 string, id int, ty int, amount decimal(38, 12) ) stored as orc; insert into table test_decimal values ('9F99855A44BD41FE592B69E0D36BF3E8', 4591, 2, ...

    1.准备测试数据

        使用如下建表语句,并插入测试数据:

    CREATE TABLE IF NOT EXISTS test_decimal(

        md5 string,

        id int,

        ty int,

        amount decimal(38, 12)

    ) stored as orc ;

    insert into table test_decimal values

    ('9F99855A44BD41FE592B69E0D36BF3E8', 4591, 2, 188593.210890000000),

    ('9F99855A44BD41FE592B69E0D36BF3E8', 4592, 2, 177918.123481132049),

    ('9F99855A44BD41FE592B69E0D36BF3E8', 4593, 2, 10675.087408867951);

    2.使用测试sql测试(在2.3.x版本中执行的)

        使用测试sql,发现测试的结果有精度损失:

    hive> select id, sum(amount) from test_decimal group by id;

    OK

    4591 188593.210890000000

    4592 177918.123481132049

    4593 10675.087408867951

    Time taken: 28.013 seconds, Fetched: 3 row(s)

     

    hive>  select id, sum(amount) * -1 from test_decimal group by id;

    OK

    4591 -188593.2108900000

    4592 -177918.1234811320

    4593 -10675.0874088680

    Time taken: 26.016 seconds, Fetched: 3 row(s)

        通过比较测试结果发现,在sum函数之后乘以 -1 导致精度损失了2位。

    3.通过分析执行计划查找两条sql的执行计划的区别,查找原因(在2.3.x版本中执行的)

        直接输出sum的sql的执行计划:

    hive> explain select id, sum(amount) from test_decimal group by id;

    OK

    STAGE DEPENDENCIES:

      Stage-1 is a root stage

      Stage-0 depends on stages: Stage-1

    STAGE PLANS:

      Stage: Stage-1

        Map Reduce

          Map Operator Tree:

              TableScan

                alias: test_decimal

                Statistics: Num rows: 3 Data size: 708 Basic stats: COMPLETE Column stats: NONE

                Select Operator

                  expressions: id (type: int), amount (type: decimal(38,12))

                  outputColumnNames: id, amount

                  Statistics: Num rows: 3 Data size: 708 Basic stats: COMPLETE Column stats: NONE

                  Group By Operator

                    aggregations: sum(amount)

                    keys: id (type: int)

                    mode: hash

                    outputColumnNames: _col0, _col1

                    Statistics: Num rows: 3 Data size: 708 Basic stats: COMPLETE Column stats: NONE

                    Reduce Output Operator

                      key expressions: _col0 (type: int)

                      sort order: +

                      Map-reduce partition columns: _col0 (type: int)

                      Statistics: Num rows: 3 Data size: 708 Basic stats: COMPLETE Column stats: NONE

                      value expressions: _col1 (type: decimal(38,12))

          Reduce Operator Tree:

            Group By Operator

              aggregations: sum(VALUE._col0)

              keys: KEY._col0 (type: int)

              mode: mergepartial

              outputColumnNames: _col0, _col1

              Statistics: Num rows: 1 Data size: 236 Basic stats: COMPLETE Column stats: NONE

              File Output Operator

                compressed: false

                Statistics: Num rows: 1 Data size: 236 Basic stats: COMPLETE Column stats: NONE

                table:

                    input format: org.apache.hadoop.mapred.SequenceFileInputFormat

                    output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

                    serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

      Stage: Stage-0

        Fetch Operator

          limit: -1

          Processor Tree:

            ListSink

    Time taken: 0.16 seconds, Fetched: 48 row(s)

    sum后乘以 -1 的sql的执行计划:

    hive> explain select id, sum(amount)*-1 from test_decimal group by id;

    OK

    STAGE DEPENDENCIES:

      Stage-1 is a root stage

      Stage-0 depends on stages: Stage-1

    STAGE PLANS:

      Stage: Stage-1

        Map Reduce

          Map Operator Tree:

              TableScan

                alias: test_decimal

                Statistics: Num rows: 3 Data size: 708 Basic stats: COMPLETE Column stats: NONE

                Select Operator

                  expressions: id (type: int), amount (type: decimal(38,12))

                  outputColumnNames: id, amount

                  Statistics: Num rows: 3 Data size: 708 Basic stats: COMPLETE Column stats: NONE

                  Group By Operator

                    aggregations: sum(amount)

                    keys: id (type: int)

                    mode: hash

                    outputColumnNames: _col0, _col1

                    Statistics: Num rows: 3 Data size: 708 Basic stats: COMPLETE Column stats: NONE

                    Reduce Output Operator

                      key expressions: _col0 (type: int)

                      sort order: +

                      Map-reduce partition columns: _col0 (type: int)

                      Statistics: Num rows: 3 Data size: 708 Basic stats: COMPLETE Column stats: NONE

                      value expressions: _col1 (type: decimal(38,12))

          Reduce Operator Tree:

            Group By Operator

              aggregations: sum(VALUE._col0)

              keys: KEY._col0 (type: int)

              mode: mergepartial

              outputColumnNames: _col0, _col1

              Statistics: Num rows: 1 Data size: 236 Basic stats: COMPLETE Column stats: NONE

              Select Operator

                expressions: _col0 (type: int), (_col1 * -1) (type: decimal(38,10))

                outputColumnNames: _col0, _col1

                Statistics: Num rows: 1 Data size: 236 Basic stats: COMPLETE Column stats: NONE

                File Output Operator

                  compressed: false

                  Statistics: Num rows: 1 Data size: 236 Basic stats: COMPLETE Column stats: NONE

                  table:

                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat

                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

                      serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

      Stage: Stage-0

        Fetch Operator

          limit: -1

          Processor Tree:

            ListSink

    Time taken: 4.656 seconds, Fetched: 52 row(s)

        通过查看两条sql(两条sql的差别是在sum函数后面有没有乘以 -1)的执行计划发现,直接输出sum的结果是 (value expressions: _col1 (type:decimal(38,12)))类型,输出乘以 -1 的结果是 ( expressions: _col0 (type: int), (_col1 * -1) (type:decimal(38,10)) )类型,说明乘以 -1 之后,精度损失了2位。

    4.分析源码,找原因

        通过分析sum后乘以 -1 的代码,其中关键的代码如下:

        2.3.x 版本的GenericUDFOPMultiply 类的关键代码

     

    Hive 2.3 decimal精度损失问题_第1张图片

        prec1 和 scale1 代表的是 decimal(38,12)

        prec2 和 scale2 代表的是 -1被转换成decimal后的类型为 decimal(1, 0)

        其中 adjustPrecScale()方法的代码在其父类GenericUDFBaseNumeric中,代码如下:

     

    Hive 2.3 decimal精度损失问题_第2张图片

        decimal支持的最大精度为38,而通过上面的计算,发现精度precision字段的值已经达到了40,超过的最大精度,因此,需要重新计算精度,计算后的结果是,将小数的精度减少了2位为10,精度使用最大精度值38。

        在hive2.3.x中,算术运算的精度的计算公式如下:

     

    Hive 2.3 decimal精度损失问题_第3张图片

        至此,精度损失的原因已经找到,是因为乘法运算,将两个精度进行相加后再加1,超出了最大精度,重新计算精度时,将小数位的精度改成了10导致的。

    5.解决方案

    1)针对这个乘以 -1 的操作,可以改成使用单目运算负号 - 的方式,将负号 - 加到sum前即可。

    2)降低建表语句中decimal类型的精度字段的值,根据上面计算精度的表算出一个满足需要的最小精度值。

    6.为啥相同的sql在1.2.x版本中结果就没有损失精度

        1.2.x 版本的GenericUDFOPMultiply 类的关键代码

    public class GenericUDFOPMultiply extends GenericUDFBaseNumeric {

    .....

      @Override

      protected DecimalTypeInfo deriveResultDecimalTypeInfo(int prec1, int scale1, int prec2, int scale2) {

        int scale = Math.min(HiveDecimal.MAX_SCALE, scale1 + scale2 );

        int prec = Math.min(HiveDecimal.MAX_PRECISION, prec1 + prec2 + 1);

        return TypeInfoFactory.getDecimalTypeInfo(prec, scale);

      }

    }

        其中 HiveDecimal.MAX_SCALE 和 HiveDecimal.MAX_PRECISION 的值都是38。

        从上面的关键代码中可以看到,在1.2.x中,没有重新校准精度的地方,而是使用简单粗暴的方式,各自计算precision和scale的精度,这就会导致在真实数据很大的时候,计算出来的值的精度达不到预期,也就是会不准确。,

    展开全文
  • <div><p>With this PR, <code>Decimal</code> logical type will be supported when Hive integration is on. This PR depends on the PR ...
  • <p>HIVE decimal => Trafodion decimal(10, 0) HIVE decimal(p,s) => Trafodion decimal(p,s) <p>hive data type definitions is from ...
  • 异常重现 1.当前集群HDFS上/tmp/newfile目录下存在文件hive.txt ...createexternaltabletest(s1string,s2decimal(13,2))rowformatdelimitedfieldsterminatedby'#'storedastextfilelocation'/tm...
  • <div><p>fix bug in 'timestamp'</p><p>该提问来源于开源项目:greenplum-db/gpdb</p></div>
  • 1、double , float ,decimal 千万不能转换成string,常常会自动使用科学计数法保存,这种转换Hive基本不支持可逆操作,只能扔人工代码转换。PS:不理解Hive为什么不内置这类函数呢。 2、上人工代码: select ...
  • 一、sqoop import 问题总结 Sqoop import as-parquetfile时...Hive:decimal, sql 查询该字段,默认为Null值; 在hdfs中查看数据,数据无误 1.2 MySQL:decimal————>Hive:double, sql 查询该字段,数据显示科学
  • 2.在迁移过程中首先启动hadoop和hive hadoop启动start-all.sh,通过方位webui查看相关服务是否启动正常 hive启动hive --service metastore &;hive --service hiveserver2 &; 查看端口10000是否启动成功,...
  • hive alter table string 转decimal时 报不支持修改业务类型错误 如下解决方案为外部表(external table)解决方案 步骤1:删除表 步骤2:在原表hdfs路径上新建与原表结构相同并修改想修改的字段为decimal类型(前提...
  • Fayson今天在Hive中插入字段类型为decimal的数据时发现,插入数据为1.0, 1.000等以 .0结尾的数据在hive中显示为1,即不显示末尾的.0 ,如下: CREATE TABLE decimaltest (d decimal(18,7)); INSERT INTO decimaltest...
  • 目前,线上反馈一个问题:同一张表,使用Hive查询正常,但是使用Impala查询,返回的数据中,部分字段值为NULL。 我们使用impala执行了invalidate metadata xxx,排查了元数据不一致的问题,同时查看源文件,也排除了...
  • 0 前言 在进行数仓搭建和数据分析时最常用的就是 sql,其语法简洁明了,易于理解,目前大数据领域的几大主流框架全部都...hive 除了支持 int,double,string等常用类型,也支持 decimal 类型,用于在数据库中存储精确
  • hivedecimal类型

    2021-06-15 11:30:04
    Hive decimal类型,最好指定长度吧。刚开始以为Hivedecimal类型和MySql一致。后来发现想错了,还是个大坑! Hivedecimal类型借鉴于Oracle,decimal(m,n)表示数字总长度为m位,小数位为n位,那么整数位就只有m-...
  • 但如果同时设置spark.sql.hive.convertMetastoreParquet为false时,要注意一些数据类型以及精度的处理,比如对于decimal类型的处理。通过一个例子复原一下当时的场景: 1.创建Hive外部表testdb.test_decimal,其中...
  • padding.enable=true -Dsqoop.parquet.logical_types.decimal.enable=true -Dsqoop.avro.logical_types.decimal.default.precision=38 -Dsqoop.avro.logical_types.decimal.default.scale=10 —parquet中对应的数据...
  • 1、hive中的decimal字段对应于pg库中的numeric,默认为(10,0),若不指定,数据将被四舍五入。比如0.82,在hive中会变成1,所以建表时最好指定精度,decimal(10,2)。 2、shell中拼接年月日得到的日期,默认会是int型...
  • 阅读本文小建议:本文适合细嚼慢咽,不要一目十行,不然会错过很多有价值的细节。 文章首发于公众号:五分钟学大数据 前言 在进行数仓搭建和数据分析时最常用的就是 sql,其语法简洁明了,易于理解,...1. decimal hive
  • java.lang.RuntimeException: MetaException(message:org.apache.hadoop.hive.serde2.avro.AvroSerdeException Invalid precision or scale for decimal type) at org.apache.hadoop.hive.ql.metadata.Table....
  • 2) A null value present in the imported JSON causes a Hive query to blow up. <p>Is there a way to make this more fault tolerant with some fallback actions in the event of a CastClass Exception ...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 238
精华内容 95
关键字:

decimalhive