详解hive常见表结构

目录
  • hive简介
  • 1.外部表
  • 2.内部表
  • 3.分区表
    • 1.静态分区
    • 2.动态分区
  • 4.分桶表
    • 1.抽样
    • 2.map-side join
  • 5.表的文件存储格式
    • 1.TEXTFILE
    • 2.SEQUENCEFILE
    • 3.RCFILE
    • 4.ORC
    • 5.Parquet
    • 6.总结
  • 5.表的行存储格式(row format)
  • 6.表属性
    • 1.压缩
      • 1.为什么要压缩
      • 2.压缩常见的格式
      • 3.压缩性能比较

hive简介

hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。hive十分适合对数据仓库进行统计分析。 [1]

1.外部表

当文件已经存在或位于远程位置时,我们可以使用外部表,外部表的存储由自己指定。

特点:删除表,数据依然存在

建表语句

CREATE EXTERNAL TABLE tmp_xx(id int,name String);

2.内部表

hive管理控制表的整个生命周期,存储位置在hive.metastore.warehouse.dir目录下。

特点:删除表时,数据也被删除

建表语句

CREATE TABLE tmp_xx(id int,name String);

3.分区表

把一个表的数据以分区字段的值作为目录去存储。

特点:

  • 缩小了硬盘扫描数据的区域,减少磁盘IO
  • 将表数据存储在多个分区目录,便于独立管理(创建,删除)数据

存储结构如下

1.静态分区

在执行前就知道分区的值

  • 可以根据PARTITIONED BY创建分区表,一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
  • 分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。
  • 分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多文件夹嵌套模式。

单分区相关语法

#单分区表创建
CREATE TABLE tmp_xx(id int,name String) partitioned by (d string);

#添加分区
ALTER TABLE tmp_partition ADD IF NOT EXISTS PARTITION (d='20220628')

#删除分区
ALTER TABLE tmp_partition DROP IF EXISTS PARTITION (d='20220628')

#数据写入
INSERT OVERWRITE TABLE tmp_xx PARTITION (d='20220629')
SELECT id, name FROM tmp_yy limit 10;

#查看分区数据
select * from tmp_xx where d='20220629'

#查看表分区
show partitions table;

#查看目录
hadoop dfs -du -h /user/hive/warehouse/tmp_xxx

多分区相关语法

#多分区表创建
CREATE TABLE tmp_xx(id int,name String) partitioned by (d String,h String);

#数据写入
INSERT OVERWRITE TABLE tmp_xx PARTITION (d='20220629',h='15')
SELECT id, name FROM tmp_yy limit 10;

#查看分区数据
select * from tmp_xx where d='20220629' and h='15'

2.动态分区

执行时才知道分区的值,相比于静态分区可以一次写入多个分区数据,而不用在每次分区写入的时候一次执行多次insert,其他的地方和静态分区都是一样的。

官方文档:https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions

特点:

  • 在INSERT … SELECT …查询中,必须在SELECT语句中的列中最后指定动态分区列,并按PARTITION()子句中出现的顺序进行排列
  • 如果动态分区和静态分区一起使用,必须是静态分区的字段在前,动态分区的字段在后。

想要使用动态分区需要hive开启动态分区,参数如下

set hive.exec.dynamic.partition=true;   --开启动态分区 默认为false,不开启
set hive.exec.dynamic.partition.mode=nonstrict; --指定动态分区模式,默认为strict

下面参数可选
SET hive.exec.max.dynamic.partitions=2048;
SET hive.exec.max.dynamic.partitions.pernode=256;
SET hive.exec.max.created.files=10000;
SET hive.error.on.empty.partition=true;

语法:

#写入数据
INSERT overwrite TABLE tmp_partition PARTITION(d)
SELECT id,NAME,d FROM tmp_xxx

#写入多分区数据
INSERT overwrite TABLE tmp_partition PARTITION(d,h)
SELECT id,NAME,d,h FROM tmp_xxx

#混合分区使用,使用动态分区和静态分区,静态分区必须在前
INSERT overwrite TABLE tmp_partition PARTITION(d='20220629',h)
SELECT id,NAME,h FROM tmp_xxx

4.分桶表

对比分区表,分桶表是对数据进行更加细粒度的划分。一般用的比较少,在数据量比较小的时候使用分桶表可能性能更差。

分桶表将整个数据内容按照分桶字段的哈希值进行区分,使用该哈希值除以桶的个数得到取余数,bucket_id = column.hashcode % bucket.num,余数决定了该条记录会被分在哪个桶中。余数相同的记录会分在一个桶里。需要注意的是,在物理结构上,一个桶对应一个文件,而分区表只是一个目录,至于目录下有多少数据是不确定的。

分桶表和分区表的区别

分区表 分桶表
存储结构 文件 目录/文件夹
创建语句 partitioned by clustered by,指定桶个数
数量 分区个数可增长 分桶数指定后不在增长
用途 避免扫描全表,通过分区列指定查询目录提高查询速度 抽样及大表join时提高效率

想要使用分桶表需要开启分桶机制,默认开启

set hive.enforce.bucketing=true

建表

CREATE TABLE tmp_bucket(id INT,NAME STRING) clustered BY (id) INTO 4 buckets

写入数据之后查看文件结构,发现表文件夹下有4个文件,说明分桶成功

1.抽样

#建表
select columns from table tablesample(bucket x out of y on column);
-- x:表示从第几个分桶进行抽样
-- y:表示每隔几个分桶取一个分桶,y必须为表bucket的整数倍或者因子

#从分桶表的建表语句中可知,我们一共分了4个桶,所以我们这里x取1,y取2
一共抽取2(4/2)个桶,从第一个桶开始,每隔2个桶抽取一次,即第一个桶和
第三个桶。
SELECT id,NAME FROM tmp_bucket tablesample(bucket 1 OUT of 2 ON id) LIMIT 10

2.map-side join

获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。

具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

需要注意的是这种方式只适用于大表,小表不适用,表的大小至少得几个G或几个T,此功能未做测试。

5.表的文件存储格式

  • STORED AS 指定表的文件存储格式默认TEXT FILE(文本文件)格式存储,
  • 默认存储格式可通过hive.default.fileformat配置修改
  • 其它常用存储格式 Parquet(列式),Avro,ORC(列式),Sequence File,INPUT FORMAT & OUTPUT FORMAT (二进制)

1.TEXTFILE

STORED AS INPUTFORMAT
   'org.apache.hadoop.mapred.TextInputFormat'
 OUTPUTFORMAT
   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

纯文本文件存储,TEXTFILE默认是hive的默认存储方式,用户可以通过配置 hive.default.fileformat 来修改。

在HDFS上可直接查看数据,可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但是使用这种方式,hive不会对数据进行切分,无法对数据进行并行操作。

存储方式:行存储

优势:可使用任意的分割符进行分割;在hdfs上可查可标记;加载速度较快;

劣势:不会对数据进行压缩处理,存储空间较大、磁盘开销大、数据解析开销大。

2.SEQUENCEFILE

STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.SequenceFileInputFormat'
  OUTPUTFORMAT
  'org.apache.hadoop.mapred.SequenceFileOutputFormat'

存储为压缩的序列化文件。是hadoop中的标准序列化文件,可压缩,可分块。SequenceFile是一个由二进制序列化过的key/value的字节流组成的文本存储文件,它可以在map/reduce过程中的input/output 的format时被使用。

SequenceFile 有三种压缩态:

  • Uncompressed – 未进行压缩的状
  • record compressed - 对每一条记录的value值进行了压缩(文件头中包含上使用哪种压缩算法的信息)
  • block compressed – 当数据量达到一定大小后,将停止写入进行整体压缩,整体压缩的方法是把所有的keylength,key,vlength,value 分别合在一起进行整体压缩,块的压缩效率要比记录的压缩效率高 hive中通过设置SET mapred.output.compression.type=BLOCK;来修改SequenceFile压缩方式。

存储方式:行存储

优势:存储时候会对数据进行压缩处理,存储空间小;支持文件切割分片;查询速度比TestFile速度快;

劣势:无法可视化展示数据;不可以直接使用load命令对数据进行加载;自身的压缩算法占用一定的空间

3.RCFILE

STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.RCFileInputFormat'
  OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'

文件存储方式为二进制文件。以RcFile文件格式存储的表也会对数据进行压缩处理,在HDFS上以二进制格式存储,不可直接查看。

RCFILE是一种行列存储相结合的存储方式,该存储结构遵循的是“先水平划分,再垂直划分”的设计里面。首先,将数据按行分块形成行组,这样可以使同一行的数据在一个节点上。然后,把行组内的数据列式存储,将列维度的数据进行压缩,并提供了一种lazy解压技术。

Rcfile在进行数据读取时会顺序处理HDFS块中的每个行组,读取行组的元数据头部和给定查询需要的列,将其加载到内存中并进行解压,直到处理下一个行组。但是,rcfile不会解压所有的加载列,解压采用lazy解压技术,只有满足where条件的列才会被解压,减少了不必要的列解压。

在rcfile中每一个行组的大小是可变的,默认行组大小为4MB。行组变大可以提升数据的压缩效率,减少并发存储量,但是在读取数据时会占用更多的内存,可能影响查询效率和其他的并发查询。用户可根据具体机器和自身需要调整行组大小。

存储方式:行列混合的存储格式,将相近的行分块后,每块按列存储。

优势:基于列存储,压缩快且效率更高,;占用的磁盘存储空间小,读取记录时涉及的block少,IO小;查询列时,读取所需列只需读取列所在块的头部定义,读取速度快(在读取全量数据时,性能与Sequence没有明显区别);

劣势:无法可视化展示数据;导入数据时耗时较长;不能直接使用load命令对数据进行加载;自身的压缩算法占用一定空间,但比SequenceFile所占空间稍小;

4.ORC

ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
  STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
  OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

ORC (Optimized Record Columnar)是RC File 的改进,主要在压缩编码、查询性能上进行了升级; ORC具备一些高级特性,如:update操作,支持ACID,支持struct、array复杂类型。Hive1.x版本后支持事务和update操作,就是基于ORC实现的(目前其他存储格式暂不支持)。

存储方式:按行组分割整个表,行组内进行列式存储。数据按行分块,每块按照列存储

文件结构:

首先做一些名词注释:

ORC文件:保存在文件系统上的普通二进制文件,一个ORC文件中包含多个stripe,每个stripe包含多条记录,这些记录按照列进行独立存储。

文件级元数据:包括文件的描述信息postscript、文件meta信息(包括整个文件的统计信息)、所有的stripe的信息和schema信息。

Stripe:一组行形成一个stripe,每次读取文件是以行组为单位的,一般为hdfs的块大小,保存了每一列的索引和数据。

Stripe元数据:保存stripe的位置、每个列在该stripe的统计信息以及所有的stream类型和位置。

Row group:索引的最小单位,一个stripe中包含多个row group,默认为10000个值组成。

Stream:一个stream表示文件中的一段有效的数据,包括索引和数据。索引stream保存每一个row group的位置和统计信息,数据stream包括多种类型的数据,具体情况由该列类型和编码方式决定。

在ORC文件中保存了三个层级的统计信息,分别为文件级别、stripe级别和row group级别,他们可以根据下发的搜索参数判断是否可以跳过某些数据。在这些统计信息中包含成员数和是否有null值,且对不同类型的数据设置了特定统计信息。

ORC的文件结构如下:

文件级别:

在ORC文件的末尾记录了文件级别的统计信息,包括整个文件的列统计信息。这些信息主要是用于查询的优化,也可以为一些简单的聚合查询如max、min、sum输出结果。

Stripe级别:

保留行级别的统计信息,用于判断该Stripe中的记录是否符合where中的条件,是否需要被读取。

Row group级别:

进一步避免读取不必要的数据,在逻辑上将一个column的index分割成多个index组(默认为10000,可配置)。以这些index记录为一个组,对数据进行统计。在查询时可根据组级别的统计信息过滤掉不必要的数据。

优势:具有很高的压缩比,且可切分;由于压缩比高,在查询时输入的数据量小,使用的task减少,所以提升了数据查询速度和处理性能;每个task只输出单个文件,减少了namenode的负载压力;在ORC文件中会对每一个字段建立一个轻量级的索引,如:row group index、bloom filter index等,可以用于where条件过滤;可使用load命令加载,但加载后select * from xx;无法读取数据;查询速度比rcfile快;支持复杂的数据类型;

劣势:无法可视化展示数据;读写时需要消耗额外的CPU资源用于压缩和解压缩,但消耗较少;对schema演化支持较差;

5.Parquet

ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
  STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
  OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'

Parquet 最初的设计动机是存储嵌套式数据,,比如Protocolbuffer,thrift,json等,将这类数据存储成列式格式,以方便对其高效压缩和编码,且使用更少的IO操作取出需要的数据。总的来说Parquet与orc相比的主要优势是对嵌套结构的支持,orc的多层级嵌套表达复杂底层未采用google dremel类似实现,性能和空间损失较大。

存储方式:列式存储

优势:具有高效压缩和编码,是使用时有更少的IO取出所需数据,速度比ORC快;其他方面类似于ORC;

劣势:不支持update;不支持ACID;不支持可视化展示数据

 
  ORC Parquet
存储方式 列存储 列存储
嵌套式结构 orc的多层级嵌套表达复杂且底层未采用google dremel类似实现,性能和空间损失较大 支持比较完美
ACID 支持 不支持
update操作 支持 不支持
索引 粗粒度索引,block/group/chuck级别统计信息 粗粒度索引,file/stripe/row级别统计信息,不能精确到列建索引。
查询性能 比parquet稍高 比ORC稍低
压缩

6.总结

需要查看到所存储的具体数据内容的小型查询,可以采用默认文件格式textfile。不需要查看具体数据的小型查询时可使用sequencefile文件格式。当用于大数据量的查询时,可以使用rcfile、ORC、parquet,一般情况下推荐使用ORC,若字段数较多,不涉及到更新且取部分列查询场景多的情况下建议使用parquet。

需要通过sqoop+hive与关系型数据库交互时,import和export的hive表需要是textfile格式。如果需要操作的表不是此存储格式,需要insert到textfile格式的表中再操作。

一、ORC与Parquet总结对比 1、orc不支持嵌套结构(但可通过复杂数据类型如map<k,v>间接实现),parquet支持嵌套结构 2、orc与hive的兼容性强,作为hive的常用存储格式 3、orc相比parquet的存储压缩率较高,如下图 4、orc导入数据和数据查询的的速度比parquet快

5.表的行存储格式(row format)

ROW FORMAT:控制文件数据和hive表中Row数据的转换,有DELIMITED和SERDE两种值,可以将ROW FORMAT看做FileFormat的功能支持或实现,我们设置了FileFormat后,底层数据格式的转换是依赖SerDe来做的。

DELIMITED:表示使用默认的LazySimpleSerDe类来处理数据,一般用于用分隔符分隔的文本文,默认使用native Serde

SERDE:Serde是 Serializer/Deserializer的简写。hive使用Serde进行行对象的序列与反序列化。Hive使用SerDe读取和写入行对象。读取就是hdfs文件反序列化成对象,写入就是对象序列化存储hdfs

read:HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object
write: row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files

一般用于比较复杂格式的文本文件,比如JSON格式行、正则表达式可以匹配出的行,像访问日志。

6.表属性

1.压缩

1.为什么要压缩

可以提高吞吐量和性能,大量减少磁盘存储空间。同时压缩也会减少文件在磁盘间的传输及IO消耗,但是压缩和截压缩会带来额外的CPU开销,但是可以节省更多的IO消耗和内存使用。

2.压缩常见的格式

压缩方式 压缩后大小 压缩速度 是否可切分
GZIP
BZIP2
LZO
Snappy

3.压缩性能比较

压缩算法 原始文件大小 压缩文件大小 压缩速度 解压速度

gzip 8.3GB 1.8GB 17.5MB/S 58MB/S

bzip2 8.3GB 1.1GB 2.4MB/S 9.5MB/S

lzo 8.3GB 2.9GB 49.3MB/S 74.6MB/S

tblproperties ('orc.compress'='snappy')
tblproperties ('parquet.compression'='snappy');

3)开启MAP输出阶段压缩 (1)开启hive中间传输数据压缩功能

hive (default)>set hive.exec.compress.intermediate=true;

(2)开启mapreduce中map输出压缩功能

hive (default)>set mapreduce.map.output.compress=true;

(3)设置mapreduce中map输出数据的压缩方式

hive (default)>set mapreduce.map.output.compress.codec=

org.apache.hadoop.io.compress.SnappyCodec;

4)开启REDUCE输出阶段压缩,比map端压缩事儿多 (1)开启hive最终输出数据压缩功能

hive (default)>set hive.exec.compress.output=true;

(2)开启mapreduce最终输出数据压缩

hive (default)>set mapreduce.output.fileoutputformat.compress=true;

(3)设置mapreduce最终数据输出压缩方式

hive (default)> set mapreduce.output.fileoutputformat.compress.codec =

org.apache.hadoop.io.compress.SnappyCodec;

(4)设置mapreduce最终数据输出压缩为块压缩

hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;

在生产环境中,常用的HIVE存储格式:列式存储的orc和parquet

HIVE压缩格式:冷数据-----gzip压缩(压缩比高,压缩解压缩速度高,不可切割);

非冷数据------lzo(可切割)和snappy(不可切割)

LZO支持切片,Snappy不支持切片。 ORC和Parquet都是列式存储。 ORC和Parquet 两种存储格式都是不能直接读取的,一般与压缩一起使用,可大大节省磁盘空间。 选择:ORC文件支持Snappy压缩,但不支持lzo压缩,所以在实际生产中,使用Parquet存储 + lzo压缩的方式更为常见,这种情况下可以避免由于读取不可分割大文件引发的数据倾斜。 但是,如果数据量并不大(预测不会有超大文件,若干G以上)的情况下,使用ORC存储,snappy压缩的效率还是非常高的。

ORC支持三种压缩:ZLIB,SNAPPY,NONE。最后一种就是不压缩,orc默认采用的是ZLIB压缩。

Parquet支持的压缩:UNCOMPRESSED、 SNAPPY、GZP和LZO,默认UNCOMPRESSED不压缩

到此这篇关于hive常见表结构的文章就介绍到这了,更多相关hive表结构内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Hive中常用正则表达式的运用小结

    在实际的应用中,通常需要在一些复杂的.没有规律的字符串中提取数据,这时候就需要用到正则表达式了,这次讲一下hive的正则表达式. like 语法:A like B 说明:如果字符串A符合表达式B的正则语法,则为true,否则为flase.B中字符"_"表示任意单个字符,而字符"%"表示任意数量的字符. 例子:select 'AA123' like 'AA%'; 结果:true 例子:select 'AAbbbbcccc' like '_A%'; 结果:true rl

  • sqoop 实现将postgresql表导入hive表

    使用sqoop导入数据至hive常用语句 直接导入hive表 sqoop import --connect jdbc:postgresql://ip/db_name --username user_name --table table_name --hive-import -m 5 内部执行实际分三部,1.将数据导入hdfs(可在hdfs上找到相应目录),2.创建hive表名相同的表,3,将hdfs上数据传入hive表中 sqoop根据postgresql表创建hive表 sqoop creat

  • python处理数据,存进hive表的方法

    首先,公司的小组长给了我一个任务,把一个txt的文件中的部分内容,存进一个在hive中已有的表的相同结构的表中.所以我的流程主要有三个,首先,把数据处理成和hive中表相同结构的数据,然后仿照已有的hive中表的结构再创建一张新的数据表,最后把本地的txt文件上传到hive中新建的数据表中. 1:已有的数据表的结构和在hive表中的结构完全对不上,下面的图是原来hive中表的结构和小组长给我的txt中表的结构: 大家可以看出,我们原来的hive中表的字段一共有17个,而组长给我的表中的字段一共有

  • Mysql元数据如何生成Hive建表语句注释脚本详解

    前言 本文主要给大家介绍了关于Mysql元数据生成Hive建表语句注释脚本的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 最近在将数据从Mysql 等其他关系型数据库 抽取到Hive 表中时,需要同步mysql表中的注释,以下脚本可以生成hive表字段注释修改语句. 注:其他关系型数据库如:oracle 可以通过相同的思路,读取元数据,修改脚本语法实现. 使用: 在mysql元数据库:information_schema 中执行以下语句 SELECT CONCAT('

  • pyspark操作hive分区表及.gz.parquet和part-00000文件压缩问题

    目录 pyspark 操作hive表 pyspark 操作hive表 pyspark 操作hive表,hive分区表动态写入:最近发现spark动态写入hive分区,和saveAsTable存表方式相比,文件压缩比大约 4:1.针对该问题整理了 spark 操作hive表的几种方式. 1> saveAsTable写入 saveAsTable(self, name, format=None, mode=None, partitionBy=None, **options) 示例: df.write.

  • 详解hive常见表结构

    目录 hive简介 1.外部表 2.内部表 3.分区表 1.静态分区 2.动态分区 4.分桶表 1.抽样 2.map-side join 5.表的文件存储格式 1.TEXTFILE 2.SEQUENCEFILE 3.RCFILE 4.ORC 5.Parquet 6.总结 5.表的行存储格式(row format) 6.表属性 1.压缩 1.为什么要压缩 2.压缩常见的格式 3.压缩性能比较 hive简介 hive是基于Hadoop的一个数据仓库工具,用来进行数据提取.转化.加载,这是一种可以存储

  • 数据库系统结构详解之三级模式结构

    说三级模式之前,先了解数据库系统模式的概念 模式,是对数据库逻辑结构的描述,是对型的描述,不涉及具体值.(如学生表,这张表的结构由Sno,sname等等属性构成)如下: 例子:"学生选课数据库"的模式: 在这里介绍一下实例: 是数据库某一时刻的状态--模式的一个具体值.(一个模式在不同的时刻可以有不同的实例) 同一个模式可以有多个实例.(学生选课数据库,有两个实例.分别是13年和14年的实例) 实例随数据库中的数据的更新而变动(随着时间的变化,会有新的学年新的学生选课实例) 一.从数据

  • 详解C语言中结构体的使用

    目录 结构体的声明 结构体成员的类型 结构体成员的访问 结构体的声明 结构体的定义:结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量. 举例: //定义结构体类型 struct tag//struct结构体关键字 tag结构体标签 struct tag结构体类型 { //成员变量 char name[20]; short age; char telphone[12]; char sex[5]; }s1,s2,s3;//s1,s2,s3是三个全局结构体变量 int m

  • 详解数据库多表连接查询的实现方法

    详解数据库多表连接查询的实现方法 通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中.当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息.连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型.为不同实体创建新的表,尔后通过连接进行查询. 连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在F

  • 第七篇Bootstrap表单布局实例代码详解(三种表单布局)

    Bootstrap提供了三种表单布局:垂直表单,内联表单和水平表单.下面逐一给大家介绍,有兴趣的朋友一起学习吧. 创建垂直或基本表单: •·向父 <form> 元素添加 role="form". •·把标签和控件放在一个带有 class .form-group 的 <div> 中.这是获取最佳间距所必需的. •·向所有的文本元素 <input>.<textarea> 和 <select> 添加 class .form-cont

  • 基于SpringMVC接受JSON参数详解及常见错误总结

    最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP.所以把一个练手项目的前台全部改成Ajax了,跳转再使用SpringMVC控制转发.对于传输JSON数据这边有了更深的一些理解,分享出来,请大家指正. 在SpringMVC中我们可以选择数种接受JSON的方式,在说SpringMVC如何接受JSON之前,我们先聊聊什么是JSON.具体的定义我也不赘述了,在JavaScript中我们经常这样定义JSON 对象 var jsonO

  • 详解C语言中结构体(struct)的用法

    目录 粉丝问答 三种结构体类型变量说明 1. 先定义结构,再定义结构变量 2. 定义结构体类型的同时说明变量 3. 直接说明结构变量 结构体成员表示方法 结构体指针做参数 结构体初始化 定义变量的同时初始化 先定义在初始化 常用初始化 typedef与struct 前置声明 结构体对齐 粉丝问答 有个粉丝在群里问了这样一个问题,问题在图中已经标出,如下图. DQuestsion 头文件的结构体的定义为: typedef struct{ u8 bmRequestType; u8 bRequest;

  • 详解Go语言中结构体与JSON间的转换

    目录 前言 结构体转 JSON JSON 解析结构体 小结 前言 在日常开发中,我们往往会将 JSON 解析成对应的结构体,反之也会将结构体转成 JSON.接下来本文会通过 JSON 包的两个函数,来介绍 JSON 与结构体之间的转换. 结构体转 JSON Marshal(v any) ([]byte, error):将 v 转成 JSON 数据,以 []byte 的形式返回. import ( "encoding/json" "fmt" ) type User s

  • 详解SQL Server表和索引存储结构

    本文详细分析了SQL Server中表和索引结构存储的原理以及对于如何加快搜索速度和提高效率等方面做了详细的分析,以下是主要内容. 下图显示了表的存储组织,每张表有一个对应的对象ID,并且包含一个或多个分区,每个分区会有一个堆或者多个B树,堆或者B树的结构是预留的.每个堆或者是B树都有三个分配单元用来存放数据,分别是数据.LOB.行溢出,使用最多的分配单元是数据.如果有LOB数据或者是长度超过8000字节的记录,则可能有另外的LOB分配单元和行溢出分配单元. 小总结: 一个表可以有多个分区,但是

  • iOS block循环引用详解及常见误区

    Block循环引用 什么情况下block会造成循环引用 ARC 情况下 block为了保证代码块内部对象不被提前释放,会对block中的对象进行强引用,就相当于持有了其中的对象,而如果此时block中的对象又持有了该block,就会造成循环引用. 常见误区 误区一.所有block都会造成循环引用 在block中,并不是所有的block都会循造成环引用,比如UIView动画block.Masonry添加约束block.AFN网络请求回调block等.     1. UIView动画block不会造

随机推荐