我们在建表的时候关于字段类型的选择会有这么几类人:
数据类型 | 描述 |
---|---|
TINYINT | 1-byte signed integer, from -128 to 127 |
SMALLINT | 2-byte signed integer, from -32,768 to 32,767 |
INT/INTEGER | 4-byte signed integer, from -2,147,483,648 to 2,147,483,647 |
BIGINT | 8-byte signed integer, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
FLOAT | 4-byte single precision floating point number |
DOUBLE | 8-byte double precision floating point number |
DECIMAL | Hive中的DECIMAL类型基于Java的BigDecimal,用于在Java中表示不可变的任意精度十进制数。所有常规的数值操作(例如+、-、*、/)和相关的UDF(例如Floor、Ceil、Round等)都可以处理DECIMAL类型。您可以像处理其他数值类型一样,对DECIMAL类型进行类型转换。DECIMAL类型的持久化格式同时支持科学计数法和非科学计数法。因此,无论您的数据集包含类似4.004E+3(科学计数法)还是4004(非科学计数法)或两者的组合的数据,都可以使用DECIMAL来处理。 |
STRING | 字符串,变长,字符串文字可以用单引号(')或双引号(“)表示 |
VARCHAR | Varchar类型在创建时需要指定长度(在1到65535之间),它定义了字符字符串中允许的最大字符数。如果转换/分配给varchar值的字符串值超过了长度指定值,那么该字符串将被静默截断 |
CHAR | 字符类型(Char types)与Varchar类似,但它们的长度是固定的,这意味着短于指定长度值的值会用空格填充,但在比较时尾部空格并不重要。最大长度固定在255 |
TIMESTAMP | 支持具有可选纳秒精度的传统UNIX时间戳 |
DATE | DATE值描述特定的年/月/日,格式为YYYY-MM-DD。例如,日期为“2013年01月01日”。日期类型没有一天中的时间组件。Date类型支持的值范围为0000-01-01到9999-12-31,这取决于原始Java Date类型的支持 |
BOOLEAN | true/false |
INTERVAL | 时间频率间隔 |
ARRAY | 有序的的同类型的集合 |
MAP | key-value,key必须为原始类型,value可以任意类型 |
STRUCT | 字段集合,类型可以不同 |
UNION | 在有限取值范围内的一个值 |
数据仓库Hive中的字段长度尽量满足相应源系统字段中最大长度的要求,当然也会考虑字段的业务含义,对于一些源系统定义过长,而从实际业务含义又不可能有那么长的字段,由仓库自行选择一个合适的长度定义;为了尽可能的保持仓库中数据类型的一致性以及规范性,数据仓库中的数据类型定义不宜过杂,建议只定义string、bigint、double类型,使得仓库中的字段类型保持整齐。
如果你的数据范围可以在TINYINT的取值范围内(-128到127或0到255),并且对存储空间和索引效率有较高的要求,使用TINYINT字段会更合适。如果数据范围超出了TINYINT的取值范围,或者对于内存消耗和运算速度要求更高,可以考虑使用INT字段。
建一张表:
create table intVsIntAnyThingDemo
(
Number1 int(1) unsigned zerofill,
Number int(8) unsigned zerofill
);
建表语句详解:
在MySQL中,unsigned 和 zerofill 是两种属性,它们可以用来修饰整数类型(如 int)。
unsigned: 表示该字段只能存储非负整数。也就是说,这个字段不能存储负数。
zerofill: 表示如果值的位数小于指定的整数位数,那么在这个值的左侧填充零。
对于字段 Number1 int(1) unsigned zerofill,由于指定了int(1),这意味着这个字段只能显示一位数字。但由于使用了unsigned zerofill,当你插入一个数字时,它会自动被填充为两位数。例如,插入5会变成05。
对于字段 Number int(8) unsigned zerofill,它可以显示8位数字。所以,插入42会变成00000042。
总结:在这个例子中,unsigned确保了字段只存储非负数,而zerofill确保字段在显示时,如果实际数字位数小于指定的位数,那么会在左侧填充零。但需要注意的是,尽管显示上似乎Number1只能存储0到9的数字,但实际上由于其unsigned属性,它可以存储从0到255的整数值。这是因为int(1)在无符号的情况下,仍然按照整数的底层存储来对待,其范围是0到255。
插入数据
insert into intVsIntAnyThingDemo values(11,22);