版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
21/27数据湖中的行转列转换第一部分行转列转换的必要性 2第二部分不同行转列转换方法的比较 3第三部分ApacheSpark中的行转列转换实现 5第四部分HiveQL中的行转列转换操作 8第五部分行转列转换的性能优化策略 11第六部分转换后的数据存储格式选择 14第七部分行转列转换的常见陷阱 17第八部分行转列转换的应用场景 21
第一部分行转列转换的必要性行转列转换的必要性
在数据处理和分析中,行转列转换(也称为转置)是一种至关重要的技术,在特定场景下具有重大优势。
提高查询效率:
*将行式数据转换为列式数据可以显著提高查询效率,特别是对于需要聚合或分组操作的大型数据集。
*列式数据存储允许查询引擎快速访问特定列,而无需扫描整个行。
*这在需要实时分析或复杂查询的场景中尤为有用。
优化数据存储:
*列式数据存储比行式数据存储更紧凑,因为它消除了重复的数据值。
*这可以节省存储空间,特别对于具有大量重复或稀疏列的数据集。
*此外,列式数据存储可以优化数据压缩,进一步减少存储需求。
提升数据可视化:
*行转列转换可以简化数据可视化。
*将数据转换为列式布局允许轻松创建图表和仪表板,突出显示特定列之间的关系和趋势。
*这对于理解数据模式和进行比较分析非常有用。
增强机器学习模型:
*机器学习模型需要以列式数据格式训练和测试。
*行转列转换可以确保模型输入数据具有正确的格式,提高模型的准确性和性能。
具体应用场景:
*时间序列数据:行转列转换可以将时间序列数据转换为适合时序分析的格式。
*宽表:对于包含大量列的宽表,行转列转换可以将其转换为更紧凑的列式布局,便于处理和查询。
*OLAP(联机分析处理):行转列转换在OLAP应用程序中至关重要,因为它允许快速聚合和分组操作。
*并行处理:列式数据存储支持并行处理,通过分布式计算提高数据处理速度。
*大数据分析:行转列转换在大数据环境中至关重要,因为它可以优化数据存储、查询和分析。
总而言之,行转列转换是一种强大的技术,对于提高查询效率、优化数据存储、增强数据可视化、提升机器学习模型和支持各种数据处理场景至关重要。第二部分不同行转列转换方法的比较关键词关键要点【方法一:PIVOT函数】
1.PIVOT函数适用于小数据集,效率较高。
2.需要预先定义转换后的列名称,限制了灵活性。
3.如果数据源存在空值或重复值,转换结果可能出现问题。
【方法二:UNPIVOT函数】
不同行转列转换方法的比较
行转列转换是一种数据转换技术,将宽表(多列)转换为高表(多行)。在数据湖中进行行转列转换至关重要,因为它可以优化数据存储、查询和分析。
方法比较
1.SparkSQL
*使用`PIVOT`函数进行转换,将列值作为新行的行值
*优点:高效、灵活,支持复杂聚合和过滤
*缺点:需要明确指定所有目标列,性能可能受到目标列数量的影响
2.PythonPandas
*使用`melt`和`pivot`函数进行转换,将列名作为新行的列名
*优点:易于使用,支持灵活的数据塑形
*缺点:性能可能不如SparkSQL,特别是对于大型数据集
3.SQLServer
*使用`PIVOT`运算符进行转换,语法与SparkSQL类似
*优点:在SQLServer环境中原生支持
*缺点:功能受限,不支持复杂聚合和过滤
4.NoSQL数据库
*使用嵌入式文档或键值对存储进行转换,将列值存储为JSON对象或映射
*优点:高度灵活,可扩展性强
*缺点:查询和分析可能复杂,性能取决于数据库实现
5.HiveQL
*使用`LATERALVIEW`子句进行转换,将列值作为新行的行值
*优点:适用于大型数据集,支持复杂的过滤和聚合
*缺点:语法复杂,性能可能受限于HiveQL查询优化器
选择标准
选择行转列转换方法时,需要考虑以下因素:
*数据量和复杂度:大数据集和复杂查询可能需要更强大的方法,如SparkSQL。
*性能要求:需要快速查询和更新的应用程序可能受益于SparkSQL或NoSQL数据库。
*灵活性:需要灵活数据建模的应用程序可能更适合Pandas或NoSQL数据库。
*技术可用性:选择可与现有基础设施和技术堆栈集成的解决方案。
最佳实践
*评估不同转换方法,选择最适合特定用例的方法。
*优化查询以避免不必要的转换。
*使用分区和索引来提高查询性能。
*考虑数据治理和元数据管理实践,以确保转换后的数据的准确性和一致性。第三部分ApacheSpark中的行转列转换实现ApacheSpark中的行转列转换实现
在ApacheSpark中,行转列转换涉及将数据集中的行转换为列。这在需要将数据重新塑造成不同的结构时很有用,例如,将宽表转换成长表。Spark提供了几种方法来实现行转列转换。
DataFrame转置
最简单的方法是使用DataFrame转置函数:
```scala
valtransposedDF=df.transpose()
```
此方法将数据集的行转换为列,并将列转换为行。
pivot()函数
Spark中的`pivot()`函数提供了一种更灵活的方式来执行行转列转换。它允许指定值列和分组列来创建透视表:
```scala
valpivotedDF=df.groupBy("col1").pivot("col2").agg(first("col3"))
```
此查询将数据集按`col1`分组,并根据`col2`创建列。对于每个`col1`组,`col3`的第一个值将填充相应的列。
stack和unstack函数
`stack`和`unstack`函数也可以用于行转列转换:
```scala
valstackedDF=df.stack("col2","col3")
valunstackedDF=stackedDF.unstack()
```
`stack`函数将指定的列转换为行,并将值存储在新的列中。`unstack`函数将堆叠的列展开回行。
示例
考虑以下示例数据集:
|id|name|city|age|
|||||
|1|John|NewYork|30|
|2|Mary|London|25|
|3|Bob|Paris|40|
要将此数据集转换为长表,我们可以使用以下查询:
```scala
valpivotedDF=df.groupBy("id").pivot("city").agg(first("age"))
```
结果数据集将如下所示:
|id|age_London|age_NewYork|age_Paris|
|||||
|1|null|30|null|
|2|25|null|null|
|3|null|null|40|
性能注意事项
行转列转换的性能可能因数据集大小、转换类型和群组数而异。对于大型数据集,使用`pivot()`函数而不是DataFrame转置可以更有效。此外,使用宽表进行转换时,可以考虑使用`stack`和`unstack`函数。
结论
ApacheSpark提供了多种行转列转换方法,以满足不同的需求。理解每种方法的优点和缺点对于高效地重新排列数据至关重要。通过利用这些方法,可以轻松地将宽表转换为长表,并为进一步的数据分析和建模做好准备。第四部分HiveQL中的行转列转换操作HiveQL中的行转列转换操作
简介
行转列转换是一种数据转换操作,它将表中的数据从行格式转换为列格式。此操作可用于将宽表(具有大量列)转换为窄表(具有较少列)。
语法
HiveQL中的行转列转换语法如下:
```
SELECT<列名>,...
FROM(SELECT*FROM<表名>)
PIVOT(<列名>)
FOR<值列名>IN(<值>)
```
参数
*`<列名>`:新表中的列名。
*`<表名>`:要转换的表的名称。
*`<列名>`:要转换为列的列名。
*`<值列名>`:要作为值列的列名。
*`<值>`:用于填充新表中列的逗号分隔值列表。
示例
考虑一个名为`sales`的表,其中包含以下数据:
|product|city|sales|
||||
|A|NewYork|100|
|B|LosAngeles|200|
|C|NewYork|300|
|D|LosAngeles|400|
要将此表转换为列格式,可以执行以下查询:
```
SELECTproduct,
SUM(CASEWHENcity='NewYork'THENsalesEND)ASsales_new_york,
SUM(CASEWHENcity='LosAngeles'THENsalesEND)ASsales_los_angeles
FROMsales
PIVOT(salesFORcityIN('NewYork','LosAngeles'))
GROUPBYproduct;
```
输出
```
product|sales_new_york|sales_los_angeles|
|||
A|100|NULL|
B|NULL|200|
C|300|NULL|
D|NULL|400|
```
此查询将`sales`列转换为新表中的列`sales_new_york`和`sales_los_angeles`。
优点
行转列转换操作具有以下优点:
*转换为窄表,便于分析和的可视化。
*允许对数据进行分组和聚合,以获得洞察力。
*减少数据冗余,提高存储效率。
局限性
行转列转换操作也有一些局限性:
*转换后的表可能很大,这可能会对查询性能产生影响。
*转换后的表可能会稀疏,其中许多值可能为空。
*对于具有大量列的宽表,转换操作可能非常耗时。
最佳实践
以下是行转列转换操作的最佳实践:
*仅将具有相关数据关系的列转换为列。
*在转换之前对数据进行分组和聚合。
*使用CASE语句处理缺失值。
*使用布尔值列或布尔表达式将数据转换为二进制格式。
*考虑使用其他转换操作(例如UNION和JOIN)来增强结果。第五部分行转列转换的性能优化策略关键词关键要点【按数据类型分区】
1.将具有相同数据类型(例如数字、字符串、日期)的行分组到不同的分区中。
2.这样,在执行行转列转换时,可以针对特定数据类型优化查询,提高性能。
3.对于具有复杂数据类型或嵌套结构的数据,可以考虑使用嵌套分区来提高查询效率。
【按数据访问模式分区】
行转列转换的性能优化策略
1.批处理转换
*将大量行数据一次性转换为列数据。
*在处理过程中,数据保存在内存中,避免了大量的磁盘I/O,提高了效率。
*适用于大数据集的转换。
2.异步转换
*异步执行行转列转换,释放应用程序线程,进行其他任务。
*适用于需要实时转换数据的场景。
3.并行处理
*使用多线程或分布式计算框架,将转换任务分解成更小的任务并行处理。
*适用于大型数据集的转换,可以显著缩短转换时间。
4.列存储优化
*转换后,将数据存储在列式格式中。
*列式格式可以减少读取列数据时的I/O,提高查询性能。
*使用高效的列式存储引擎,如Parquet或ORC,进一步优化性能。
5.数据压缩
*使用压缩算法对转换后的数据进行压缩。
*压缩可以减小数据量,降低存储和传输成本,提高查询性能。
*选择合适的压缩算法,平衡压缩率和解压缩速度。
6.数据分区
*根据特定键将数据分区为更小的数据集。
*分区可以减少读取整个数据集时所需的I/O,提高查询性能。
*使用合理的键进行分区,确保每个分区的数据量大致相同。
7.索引优化
*为转换后的列创建必要的索引。
*索引可以加快查询速度,减少I/O,缩短响应时间。
*根据查询模式和数据特征,选择合适的索引类型和策略。
8.数据类型优化
*优化转换后的数据类型,以减少存储空间和提高查询性能。
*使用适当的数据类型,如INT而不是STRING,可以节省存储空间和提高查询速度。
*避免使用可变长度数据类型,如STRING或BLOB,因为它们会增加存储空间和查询开销。
9.语法优化
*优化行转列转换的SQL语句,减少资源消耗和提高性能。
*使用适当的JOIN和UNION操作,避免冗余计算。
*利用索引和分区信息,优化查询计划。
10.工具性能优化
*使用高效的数据湖工具和框架。
*选择经过优化和广泛使用的工具,以确保转换过程的性能。
*了解工具的功能和最佳实践,以充分利用它们。
额外建议:
*监控转换过程并收集性能指标,以发现瓶颈和进行持续优化。
*进行基准测试以比较不同优化策略的性能。
*与数据湖供应商或社区专家协作,获得最佳实践和支持。第六部分转换后的数据存储格式选择关键词关键要点扁平存储格式:
1.将数据存储为单个大型文件,所有数据都在同一层级上。
2.易于存储和读取大量非结构化数据。
3.对于复杂的查询和数据模型可能效率较低。
分区存储格式:
行转列转换后的数据存储格式选择
简介
行转列转换是一种数据重塑技术,将数据从行格式转换为列格式,从而实现数据的更有效存储和处理。转换后的数据存储格式选择对性能和可伸缩性至关重要。
格式选择因素
选择转换后的数据存储格式时,需要考虑以下因素:
*数据量:数据量的规模将决定所需的存储格式。
*数据类型:数据的类型,如数字、文本或日期,将影响存储格式。
*查询模式:对数据执行的查询类型将影响数据存储的优化。
*处理需求:转换后的数据是否需要进行进一步的处理,例如聚合或筛选。
常见格式
转换为列格式后的数据通常存储在以下格式中:
1.宽表(WideTable)
*优点:
*查询性能高,特别是对于跨多列的查询。
*节省存储空间,因为相同列的数据存储在相邻位置。
*支持灵活的数据模式,可以轻松添加或删除列。
*缺点:
*对于少量列的数据集,会浪费存储空间。
*可能存在数据稠密度问题,即某些列可能包含大量空值。
2.列族(ColumnFamily)
*优点:
*与宽表类似,查询性能高。
*支持按列簇分组数据,提高了数据组织和可管理性。
*有助于管理大数据集,因为列簇可以独立缩放。
*缺点:
*对于少量列簇的数据集,可能会浪费存储空间。
*可能导致数据稠密度问题,因为不同列簇中的数据可能具有不同的空值模式。
3.稀疏矩阵(SparseMatrix)
*优点:
*非常适合存储具有大量空值的数据。
*节省存储空间,因为仅存储非空值。
*支持对稀疏数据的快速查询。
*缺点:
*查询性能通常低于宽表或列族。
*对于密集数据,可能会浪费存储空间。
4.Delta湖
*优点:
*结合了宽表和稀疏矩阵的优点。
*提供事务支持,确保数据一致性。
*支持时间旅行,允许访问数据的历史状态。
*缺点:
*可能会产生更高的存储成本。
*查询性能可能不如专门针对宽表或稀疏矩阵的格式。
5.Parquet
*优点:
*一种列式文件格式,提供快速读取和压缩。
*支持多种数据类型和复杂数据结构。
*可与各种分析工具集成。
*缺点:
*对于更新操作,可能会产生开销。
*不支持事务。
选择指南
以下是一些指导原则,可帮助您选择最佳的转换后数据存储格式:
*密集数据:选择宽表或列簇。
*稀疏数据:选择稀疏矩阵或Delta湖。
*要求可扩展性:选择Delta湖或Parquet。
*要求事务支持:选择Delta湖。
*要求灵活的数据模式:选择宽表。
*需要低存储成本:选择稀疏矩阵或Parquet。
总之,转换后的数据存储格式选择取决于特定数据集和应用程序的需求。通过仔细考虑上述因素和格式指南,您可以优化数据存储以获得最佳性能和可伸缩性。第七部分行转列转换的常见陷阱关键词关键要点主题名称:数据完整性和数据一致性
1.数据转换过程中可能会丢失数据,导致数据不完整。
2.数据转换后的列中可能包含重复数据,造成数据不一致。
3.数据类型转换错误也会导致数据不一致,影响数据质量。
主题名称:数据格式和兼容性
行转列转换的常见陷阱
行转列转换涉及将表中按行组织的数据转换为按列组织。虽然这对于数据分析和建模非常有用,但它也可能引入一些陷阱,这些陷阱可能会导致错误或误导性的结果。
1.丢失或重复数据
当行包含重复值时,行转列转换可能会导致数据丢失或重复。例如,考虑一个包含以下行的表:
|id|name|value|
||||
|1|John|10|
|1|John|20|
将其转换为按列组织的表时,可能会出现以下情况:
|id|name|value1|value2|
|||||
|1|John|10|NULL|
|1|John|NULL|20|
在这种情况下,第二个值(20)会丢失。为了避免这种情况,可以使用聚集函数(如SUM或MAX)来合并重复值。
2.数据类型转换错误
当列数据类型不同时,行转列转换可能会导致数据类型转换错误。例如,考虑一个包含以下行的表:
|id|name|value|
||||
|1|John|"10"|
|2|Mary|"20.5"|
将其转换为按列组织的表时,可能会出现以下情况:
|id|name|value1|value2|
|||||
|1|John|10|NULL|
|2|Mary|NULL|20.5|
在这种情况下,第一个值("10")将被转换为整数,而第二个值("20.5")将被转换为浮点数。为了避免这种情况,请确保所有列具有相同的数据类型,或者使用CAST函数进行显式转换。
3.列名冲突
当多个行包含相同列名称时,行转列转换可能会导致列名冲突。例如,考虑一个包含以下行的表:
|id|name|amount|
||||
|1|John|10|
|2|Mary|20|
|3|John|30|
将其转换为按列组织的表时,可能会出现以下情况:
|id|name|John|Mary|
|||||
|1|John|10|NULL|
|2|Mary|NULL|20|
|3|John|30|NULL|
在这种情况下,两个"John"列会导致混淆。为了避免这种情况,请使用唯一列名称或前缀来区分列。
4.空值处理不当
空值在行转列转换中可能是一个挑战。例如,考虑一个包含以下行的表:
|id|name|value|
||||
|1|John|10|
|2|Mary|NULL|
将其转换为按列组织的表时,可能会出现以下情况:
|id|name|value1|value2|
|||||
|1|John|10|NULL|
|2|Mary|NULL|NULL|
在这种情况下,用于填充空值的NULL值会传播到转换后的表中。为了避免这种情况,请使用特殊的占位符或聚集函数来处理空值。
5.性能问题
大型数据集的行转列转换可能会导致性能问题。对于包含大量行的表,转换可能需要很长时间才能完成。为了优化性能,请考虑使用分区或索引,并使用适当的列数据类型。
6.数据完整性问题
行转列转换可能会破坏源表中的数据完整性约束。例如,考虑一个具有唯一键约束的表:
|id|name|value|
||||
|1|John|10|
|2|Mary|20|
将其转换为按列组织的表时,可能会出现以下情况:
|id|name|value|
||||
|1|John|10|
|2|Mary|20|
|1|John|20|
在这种情况下,转换后的表将违反唯一键约束。为了避免这种情况,请确保转换后保留所有数据完整性约束。
规避陷阱的最佳实践
为了规避行转列转换的陷阱,请遵循以下最佳实践:
*在转换之前仔细检查数据并识别任何潜在问题。
*使用聚集函数和CAST函数处理重复值和数据类型转换。
*使用唯一列名称或前缀避免列名冲突。
*使用特殊占位符或聚集函数适当处理空值。
*优化转换性能,使用分区或索引。
*确保转换后保留数据完整性约束。第八部分行转列转换的应用场景行转列转换的应用场景
行转列转换在数据分析和处理中有着广泛的应用场景,以下是一些最常见的示例:
数据透视分析
*透视表和交叉表创建:行转列转换可以将行数据转换为列数据,以便轻松创建透视表和交叉表,从而分析不同维度上的数据汇总。
*维度建模:在维度建模中,事实表(度量值)的列通常表示维度属性,而行则表示观察值。行转列转换可以将事实表转换为星形或雪花形模式,以便进行快速查询和聚合。
数据挖掘和机器学习
*特征工程:行转列转换可以将一组行数据转换为一组列,以创建机器学习算法所需的特征向量。这使数据科学家能够探索和创建更具信息量的特征集。
*聚类和分类:聚类和分类算法通常需要特征向量作为输入。行转列转换可以将行数据转换为适当的格式,以便进行这些分析。
数据报告和可视化
*交互式仪表盘:行转列转换可以将数据转换为仪表盘中使用的列格式,使数据分析人员能够轻松创建交互式可视化,以探索和呈现不同维度的数据。
*图表和图形:转换后,行数据可以用于创建各种图表和图形,如柱状图、折线图和饼状图,以便以视觉方式呈现数据洞察。
数据集成和迁移
*系统间数据交换:行转列转换可以在不同的系统和应用程序之间交换数据时,将数据转换为所需的格式。
*数据仓库和数据湖加载:行转列转换可以用于将数据从源系统加载到数据仓库或数据湖中,从而以最优格式存储数据以支持分析。
其他应用场景
*数据清洗和准备:行转列转换可以用于识别和纠正数据中的不一致和错误。
*数据转换和映射:行转列转换可以帮助将数据从一种格式转换为另一种格式,以符合特定的业务需求或系统要求。
*数据归档和保留:行转列转换可以用于将数据转换为归档或保留的目的,以节省存储空间或满足法规遵从性要求。关键词关键要点主题名称:数据分析效率提升
关键要点:
1.行转列转换可以将宽表转换为长表,从而使数据更易于分析和处理。
2.长表格式便于使用聚合函数和计算指标,从而提高数据分析效率。
3.通过减少表中的冗余数据,行转列转换可以优化查询性能,从而加速数据处理速度。
主题名称:数据可视化增强
关键要点:
1.行转列转换生成的表格数据可以直接与可视化工具兼容,简化图表创建过程。
2.长表格式提供了更清晰的数据组织结构,使数据可视化更加简洁易懂。
3.行转列转换可以将多个指标合并到单个图表中,从而提供更全面的数据洞察。
主题名称:特征工程简化
关键要点:
1.行转列转换可以将多条记录中的字段拆分为单独的行,从而简化特征工程过程。
2.长表格式使特征提取和数据清理更加直接和有效,从而节省时间和精力。
3.通过隔离不同实体的数据,行转列转换可以提高特征选择的准确性和相关性。
主题名称:机器学习模型完善
关键要点:
1.行转列转换产生的长表格式数据符合机器学习算法的输入要求,便于训练和评估模型。
2.通过将宽表中的相关数据组织成行,行转列转换可以增强特征之间的相关性,从而提高模型性能。
3.长表格式可以方便地提取和组合特征,从而扩展模型的特征空间,提高预测准确性。
主题名称:数据仓库优化
关键要点:
1.行转列转换可以将维度表和事实表合并为一个宽表,从而优化数据仓库设计。
2.宽表格式可以简化查询和报告,减少数据冗余并提高数据一致性。
3.通过减少表连接和聚合操作,行转列转换可以降低数据仓库的复杂性和维护成本。
主题名称:数据管理规范化
关键要点:
1.行转列转换可以将数据标准化,确保不同的数据集具有相同的列和数据类型。
2.长表格式便于数据管理和治理,简化数据整合和交换。
3.通过强制执行数据规范,行转列转换可以提高数据质量,并减少因数据不一致造成的错误。关键词关键要点行转列转换的Spark实现
1.行转列转换
*行转列转换是将数据表中的一行数据转换为多列数据,常用于数据透视和汇总操作。
*Spark提供了DataFrameAPI中的`pivot`和`unpivot`函数来实现行转列转换。
2.使用pivot函数执行行转列转换
*`pivot`函数将数据表的列作为行,将指定的列作为列,并将聚合函数应用于每个值。
*例如:`df.groupBy("id").pivot("category").sum("value")`将根据`id`分组,并按`category`透视数据。
3.使用unpivot函数执行行转列转换
*`unpivot`函数将数据表的列转换为行,其中列名存储在`name`列中,列值存储在`value`列中。
*例如:`df.unpivot(Array("col1","col2"))`将`col1`和`col2`转换为行,并将列名分别存储为`name`和`value`。
4.行转列转换的优化
*使
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电气机械电子材料技术考核试卷
- DB11T 852.3-2014 地下有限空间作业安全技术规范第3部分:防护设备设施配置
- DB11∕T 3008.4-2018 人力资源服务规范 第4部分:信息网络服务
- 带下的课件教学课件
- 情绪调适课件教学课件
- 藏族的课件教学课件
- 税收实务课件教学课件
- 淮阴工学院《模拟电子技术1》2022-2023学年期末试卷
- 淮阴工学院《继电保护》2023-2024学年期末试卷
- 淮阴工学院《机器学习基础》2022-2023学年期末试卷
- 《矿山机械设备》复习题
- 冷库工程特点施工难点分析及对策
- 中国古代楼阁PPT课件
- 排舞教案_图文
- 简单趋向补语:V上下进出回过起PPT课件
- 路由和波长分配PPT课件
- 超声检测工艺卡
- 公司“师带徒”实施方案
- AP1000反应堆结构设计
- 《内科护理学》病例分析(完整版)
- 5GQoS管理机制介绍
评论
0/150
提交评论