广州住建官方网站什么是电商?
2026/4/22 11:01:19 网站建设 项目流程
广州住建官方网站,什么是电商?,wordpress显示对方ip,公司做网站的费用计什么科目大数据领域列式存储#xff1a;加速数据查询的利器 关键词#xff1a;列式存储、行式存储、数据压缩、大数据查询、存储架构、Parquet、数据仓库 摘要#xff1a;在大数据时代#xff0c;数据查询慢是许多企业的痛点——当你需要从TB级数据中提取某几列的统计结…大数据领域列式存储加速数据查询的利器关键词列式存储、行式存储、数据压缩、大数据查询、存储架构、Parquet、数据仓库摘要在大数据时代数据查询慢是许多企业的痛点——当你需要从TB级数据中提取某几列的统计结果时传统存储方式可能需要扫描整个文件。本文将带你用超市货架摆放的生活视角理解列式存储这一加速查询的核心技术从行式与列式的本质区别到压缩编码、分块存储的底层原理再到Apache Parquet的实战案例最后揭秘它如何让数据查询效率提升10倍以上。读完本文你将彻底明白为什么现代数据仓库如Hive、Spark都在用列式存储背景介绍目的和范围本文聚焦大数据领域的列式存储技术从基础概念到实战应用全面解析。我们将回答以下核心问题列式存储与传统行式存储有何本质区别为什么列式存储能让查询速度提升10倍常见的列式存储格式如Parquet、ORC是如何工作的企业如何选择和应用列式存储预期读者数据工程师/分析师想优化数据查询效率的实践者大数据初学者希望理解底层存储原理的学习者技术管理者需要评估存储方案的决策者文档结构概述本文将按照概念对比→原理拆解→实战验证→场景应用的逻辑展开。先通过生活案例理解行式与列式的差异再深入解析列式存储的核心技术压缩、分块最后通过Parquet实战演示其性能优势。术语表术语解释行式存储按行为单位存储数据如Excel表格一行是一条完整记录列式存储按列为单位存储数据每列独立存储如将所有年龄值单独存成一个文件压缩编码对重复数据进行高效压缩的算法如字典编码、游程编码ParquetApache开源的列式存储格式广泛用于Hadoop、Spark生态数据分块将大文件拆分为多个小文件块便于并行处理和随机访问核心概念与联系从超市货架看行式VS列式故事引入超市找商品的两种方式假设你开了一家超市要摆放1000种商品每种商品有3个属性名称、价格、库存。现在有两种摆放方式行式摆放把每种商品的所有属性放在一起像货架上摆苹果名称-5元价格-100斤库存、“香蕉-3元-200斤”…列式摆放把所有商品的价格单独放一排货架5元、3元、…库存放另一排100斤、200斤、…名称放第三排现在你需要回答两个问题想知道所有商品的价格总和——哪种摆放方式更快想打印第100号商品的完整信息——哪种方式更快答案很明显第一个问题列式更快只需要扫价格货架第二个问题行式更快直接找第100号商品的位置。这正是大数据查询中最常见的场景分析类查询通常只需要几列数据而事务类查询需要整条记录。列式存储就是为分析类查询量身定制的高效货架。核心概念解释像给小学生讲故事概念一行式存储Row Storage行式存储就像写日记——每天的日记一行数据包含日期、天气、事件所有字段所有日记按顺序装订成一本本子文件。当你想查所有雨天的事件时必须从头翻到尾逐行检查天气字段即使只需要天气和事件也要读完整行。概念二列式存储Columnar Storage列式存储像整理相册——把所有照片的拍摄年份单独存成一本相册拍摄地点存另一本人物存第三本。当你想统计2023年所有北京拍摄的照片时只需要翻年份相册找到2023年的照片编号再翻地点相册匹配北京的编号最后取交集即可不需要看其他字段。概念三列式存储的三大法宝列式存储能高效的关键在于三个核心技术列独立存储每列数据单独存放如所有年龄值存在一起压缩编码同一列数据重复多如性别只有男/女可以用更紧凑的方式存储分块存储把大文件切成小块如每10000行存成一个块方便并行处理核心概念之间的关系用超市打比方行式VS列式行式是按商品摆货架适合查单个商品列式是按属性摆货架适合查属性统计列独立存储→压缩编码同一列数据类型相同如都是整数价格重复值多如很多商品价格是9.9元所以压缩效果更好就像把100个9.9元写成9.9元×100分块存储→并行查询把大文件切成小块像把超市分成A/B/C区查询时可以同时派多个员工CPU核心分别查不同区域最后合并结果核心概念原理和架构的文本示意图行式存储结构 文件1: [行1: 字段1,字段2,字段3] [行2: 字段1,字段2,字段3] ... [行N: 字段1,字段2,字段3] 列式存储结构 文件1字段1列: [字段1行1,字段1行2,...,字段1行N] 文件2字段2列: [字段2行1,字段2行2,...,字段2行2] 文件3字段3列: [字段3行1,字段3行2,...,字段3行N]Mermaid 流程图行式VS列式查询过程对比查询需求统计所有用户的年龄平均值行式存储列式存储读取所有行的完整记录提取每行的年龄字段计算平均值仅读取年龄列的所有值直接计算平均值完成核心算法原理 具体操作步骤列式存储为什么快列式存储的高效性源于两个关键技术数据压缩和向量化处理。我们以最常用的字典编码和游程编码为例用Python代码演示压缩过程。1. 数据压缩让存储体积缩小10倍同一列数据往往有大量重复值如性别列只有男/女地区列只有几十个城市。列式存储通过特定编码算法将重复数据压缩减少IO读取量。示例1字典编码Dictionary Encoding假设我们有一列地区数据[“北京”,“上海”,“北京”,“北京”,“上海”]。字典编码的步骤如下收集所有唯一值→字典{0:北京, 1:上海}将原数据替换为字典索引→[0,1,0,0,1]存储字典索引数组原数据需要存储5个字符串现在只需要存储2个字符串5个整数Python代码实现defdictionary_encode(column):# 步骤1生成字典唯一值→索引unique_valueslist(set(column))value_to_idx{v:ifori,vinenumerate(unique_values)}# 步骤2替换为索引数组encoded[value_to_idx[v]forvincolumn]returnunique_values,encoded# 测试数据original_column[北京,上海,北京,北京,上海]unique_dict,encoded_datadictionary_encode(original_column)print(原数据:,original_column)print(字典:,unique_dict)print(编码后:,encoded_data)输出结果原数据: [北京, 上海, 北京, 北京, 上海] 字典: [上海, 北京] # 注意顺序可能因set随机但不影响压缩 编码后: [1, 0, 1, 1, 0]存储体积对比原数据需要存储5个字符串假设每个占2字节共10字节编码后存储字典2个字符串×24字节索引数组5个整数×15字节总9字节实际中字符串越长压缩效果越明显。示例2游程编码RLE, Run-Length Encoding适合连续重复值的列如温度传感器数据25,25,25,26,26。编码规则将连续相同的值表示为值重复次数。Python代码实现defrle_encode(column):encoded[]current_valuecolumn[0]count1forvalueincolumn[1:]:ifvaluecurrent_value:count1else:encoded.append((current_value,count))current_valuevalue count1encoded.append((current_value,count))# 处理最后一个值returnencoded# 测试数据original_column[25,25,25,26,26,26,26]encoded_datarle_encode(original_column)print(原数据:,original_column)print(编码后:,encoded_data)输出结果原数据: [25, 25, 25, 26, 26, 26, 26] 编码后: [(25, 3), (26, 4)]存储体积对比原数据需要7个整数假设每个4字节共28字节编码后存储2个元组每个元组2×48字节共16字节压缩率57%。2. 向量化处理CPU的批量处理模式列式存储将同一列数据连续存储如内存中一个整数数组CPU可以利用向量化指令如AVX2、AVX-512批量处理整列数据。就像你吃瓜子时抓一把一起嗑比一个一个嗑更快。例如计算10000个整数的平均值行式存储需要遍历10000行每次读取该行的整数内存不连续CPU缓存命中率低列式存储直接操作连续的整数数组内存连续CPU可以一次性加载到缓存用SIMD指令批量计算数学模型和公式用数字量化列式存储的优势假设我们有一张表包含N行M列每行大小为S字节总数据量N×S。现在要查询其中K列KM的统计值如求和。行式存储的IO量行式存储需要读取所有N行的完整数据即使只需要K列因此IO量为I O r o w N × S IO_{row} N \times SIOrow​N×S列式存储的IO量列式存储仅需读取K列的数据。假设每列大小为S/K因为每行S字节由M列平均分摊且压缩率为C压缩后体积为原体积的1/C则IO量为I O c o l u m n a r K × N × ( S / M ) C IO_{columnar} K \times \frac{N \times (S/M)}{C}IOcolumnar​K×CN×(S/M)​效率对比示例假设M1010列S100字节每行100字节K2查询2列C5压缩5倍N100万行行式IO量100万×1001亿字节约100MB列式IO量2×(100万×10)/540万字节约0.4MB效率提升250倍100MB/0.4MB250这就是为什么在分析场景中列式存储能将查询时间从分钟级缩短到秒级。项目实战用Parquet体验列式存储的魅力Apache Parquet是Hadoop生态中最流行的列式存储格式Spark、Hive、Flink都支持。我们通过一个实战案例演示如何用Python生成Parquet文件并对比其与CSV行式的查询效率。开发环境搭建安装依赖库pip install pyarrow pandas准备测试数据生成100万行的模拟用户数据包含id、name、age、gender、city 5列源代码详细实现和代码解读步骤1生成测试数据importpandasaspdimportnumpyasnp# 生成100万行数据data{id:np.arange(1,1_000_001),# ID从1到100万name:[fuser_{i}foriinrange(1,1_000_001)],# 用户名age:np.random.randint(18,60,size1_000_000),# 年龄随机18-60gender:np.random.choice([男,女],size1_000_000),# 性别随机city:np.random.choice([北京,上海,广州,深圳],size1_000_000)# 城市随机}dfpd.DataFrame(data)步骤2保存为CSV行式和Parquet列式# 保存为CSV行式df.to_csv(users.csv,indexFalse)# 保存为Parquet列式importpyarrowaspaimportpyarrow.parquetaspq# 将Pandas DataFrame转为Arrow Tabletablepa.Table.from_pandas(df)# 保存为Parquet文件默认启用SNAPPY压缩pq.write_table(table,users.parquet)步骤3对比文件大小# 查看文件大小Linux命令$ls-lh users.csv users.parquet -rw-r--r--1user user 72M1月100:00 users.csv -rw-r--r--1user user 12M1月100:00 users.parquet结论Parquet文件体积仅为CSV的1/672MB→12MB这是压缩编码的直接效果。步骤4对比查询效率统计年龄平均值importtime# 查询CSV文件的年龄平均值需要读取所有列starttime.time()df_csvpd.read_csv(users.csv,usecols[age])# 仅读取age列avg_age_csvdf_csv[age].mean()csv_timetime.time()-start# 查询Parquet文件的年龄平均值仅读取age列starttime.time()df_parquetpq.read_table(users.parquet,columns[age]).to_pandas()avg_age_parquetdf_parquet[age].mean()parquet_timetime.time()-startprint(fCSV查询时间:{csv_time:.2f}秒)print(fParquet查询时间:{parquet_time:.2f}秒)输出结果测试环境MacBook Pro M1CSV查询时间: 4.23秒 Parquet查询时间: 0.15秒结论Parquet的查询速度是CSV的28倍这是因为Parquet仅读取age列而CSV需要读取整行包括name、city等无关列Parquet的压缩格式减少了磁盘IO量Parquet的列式存储支持向量化读取Arrow库的优化实际应用场景列式存储在以下场景中表现尤为突出1. 数据分析与BI工具当使用Tableau、Power BI等工具做可视化分析时用户通常需要按不同维度如地区、时间汇总指标如销售额。列式存储只需读取相关维度列和指标列大幅缩短查询时间。2. 数据仓库如Hive、Spark SQL数据仓库的核心是处理大规模历史数据的复杂查询如JOIN、GROUP BY。列式存储的压缩和列独立特性能减少集群节点间的数据传输量这是分布式计算的主要瓶颈。3. 实时数据处理如Flink、Kafka Connect现代实时处理框架需要高效存储流式数据。列式存储的分块特性如Parquet的Row Group允许增量写入同时保持查询效率无需读取全量数据。4. 机器学习特征存储机器学习需要从海量数据中提取特征如用户的历史点击次数、平均消费金额。列式存储可以快速提取所需特征列避免读取无关数据提升特征工程效率。工具和资源推荐列式存储格式对比格式适用场景压缩算法生态支持Parquet离线分析Hadoop/SparkSNAPPY、GZIP、LZO最广泛Spark、Hive、FlinkORCHive专属场景ZLIB、SNAPPYHive优化与Parquet互补Avro实时流数据Kafka无/自定义适合需要模式演进的场景学习资源官方文档Apache Parquet官方文档实战书籍《Hadoop权威指南》第4章 列式存储详解工具推荐parquet-tools命令行查看Parquet文件元数据未来发展趋势与挑战趋势1云原生列式存储随着云存储如AWS S3、阿里云OSS的普及列式存储正在与云对象存储深度融合。例如Delta Lake、Iceberg等湖仓一体方案基于Parquet实现了云存储事务支持高效查询的组合。趋势2实时写入优化传统列式存储如Parquet更适合批量写入对实时写入如每秒10万条支持较弱。新一代列式存储如Apache Iceberg的小文件合并功能正在优化这一短板实现实时写入高效查询的平衡。挑战模式演进Schema Evolution当业务需求变化时数据 schema如新增列、修改列类型需要被兼容。列式存储需要支持前向兼容新读取旧数据和后向兼容旧读取新数据这对元数据管理提出了更高要求。总结学到了什么核心概念回顾行式存储按行存储适合事务类查询查单条记录列式存储按列存储适合分析类查询查多列统计关键技术列独立存储、压缩编码、分块存储概念关系回顾列式存储的高效性是技术组合拳的结果列独立存储→减少无关数据读取压缩编码→降低IO量分块存储→支持并行处理向量化处理→提升CPU利用率思考题动动小脑筋假设你需要设计一个电商数据库其中订单表每天新增100万条需要频繁查询某用户的所有订单商品表每月更新一次需要频繁统计各品类的销售额你会为订单表和商品表分别选择行式还是列式存储为什么列式存储在压缩时可能遇到字典冲突如两个不同版本的数据使用了不同的字典索引如何解决这个问题提示参考Parquet的冗余字典存储机制附录常见问题与解答Q列式存储适合所有场景吗A不。如果业务需要频繁读取整行数据如电商的查看订单详情行式存储如MySQL更高效。列式存储是分析场景的优化解不是万能解。QParquet和ORC有什么区别AParquet由Twitter和Cloudera开发更侧重跨生态兼容性Spark、Flink都支持ORC由Hive团队开发针对Hive查询做了优化如更细粒度的索引。实际中两者性能接近选择主要看生态适配。Q列式存储如何处理缺失值A通过**有效性位图Validity Bitmap**存储每列的缺失情况。例如用一个二进制数组标记该位置的值是否有效1有效0缺失避免因缺失值破坏数据连续性。扩展阅读 参考资料《大数据存储技术实战》—— 王磊机械工业出版社Apache Parquet官方文档https://parquet.apache.org/docs/论文《Dremel: Interactive Analysis of Web-Scale Datasets》Google列式存储的经典设计

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询