Hive开发规范与SQL编写指南

5星 · 超过95%的资源 需积分: 50 42 下载量 160 浏览量 更新于2024-07-17 1 收藏 203KB DOCX 举报
"Hive开发规范涉及SQL编写和日志处理,包括数据开发规范、Hive数据目录结构、字段分隔符、空值处理以及分区表的创建方式等关键点。" 在Hive开发中,遵循一定的规范至关重要,因为它有助于保持数据的整洁、一致性,并提高查询效率。以下是对这些规范的详细解释: 1. **数据开发规范**:这部分规定了如何在Hive中组织和管理数据。例如,表分区键的命名应遵循特定的规则,如月分区键以`month`表示,日分区键以`day`表示。此外,避免在创建分区键时与表字段名重复,以减少混淆。 2. **Hive数据目录规范**:表数据在HDFS(Hadoop Distributed File System)上的存储位置是固定的,通常位于 `/user/hive/warehouse/模式名.db/表名/分区名/[子分区名]`。这个路径清晰地表明了数据的归属,便于管理和检索。例如,`/user/hive/warehouse/ods.db/dwa.db/dwa_s_d_use_mb_voice_comm_d/month=201405/day=31` 是一个具体的表分区路径。 3. **字段分隔符**:Hive表的字段默认使用`\001`作为字段分隔符。对于接口层表,应保留源文件中的字段分隔符不变,以确保数据导入的兼容性。此外,对于空值的处理,建议使用`SERDEPROPERTIES('serialization.null.format'='')`来统一定义,保证导出数据的正确性。 4. **分区表结构**:Hive支持单分区和多分区表。单分区表在表的文件夹目录下只有一个分区级别,而多分区表会有多个嵌套的分区目录。创建分区表的示例如下: - **单分区表**:如`createtable dwa_v_d_wap_mb_url_label (字段定义) partitioned by (month string)`,这里的`month`是分区键。 - **多分区表**:与单分区表类似,但可以添加更多分区键,如`partitioned by (month_id string, day_id string)`。 这些规范不仅提高了数据的组织性和可维护性,还简化了复杂查询的编写和执行,使得大数据处理更加高效。在实际开发中,团队成员应共同遵守这些规范,以确保项目的顺利进行和数据的一致性。同时,良好的日志处理也是关键,它可以帮助跟踪和诊断可能出现的问题,确保系统稳定运行。
2010-01-27 上传
8.用执行计划分析SQL性能      EXPLAIN PLAN是一个很好的分析SQL语句的工具,它可以在不执行SQL的情况下分析语句      通过分析,我们就可以知道ORACLE是怎样连接表,使用什么方式扫描表(索引扫描或全表扫描),以及使用到的索引名称      按照从里到外,从上到下的次序解读分析的结果      EXPLAIN PLAN的分析结果是用缩进的格式排列的,最内部的操作将最先被解读,如果两个操作处于同一层中,带有最小操作号的将首先被执行      目前许多第三方的工具如PLSQL Developer和TOAD等都提供了极其方便的EXPLAIN PLAN工具      PG需要将自己添加的查询SQL文记入log,然后在EXPLAIN PLAN中进行分析,尽量减少全表扫描      ORACLE SQL性能优化系列      1.选择最有效率的表名顺序(只在基于规则的优化器中有效)      ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理      在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表      当ORACLE处理多个表时,会运用排序及合并的方式连接它们      首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;      然后扫描第二个表(FROM子句中最后第二个表);      最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并      例如:      表 TAB1 16,384 条记录      表 TAB2 5 条记录      选择TAB2作为基础表 (最好的方法)      select count(*) from tab1,tab2 执行时间0.96秒      选择TAB2作为基础表 (不佳的方法)      select count(*) from tab2,tab1 执行时间26.09秒      如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表      例如:   EMP表描述了LOCATION表和CATEGORY表的交集   SELECT *   FROM LOCATION L,   CATEGORY C,   EMP E   WHERE E.EMP_NO BETWEEN 1000 AND 2000   AND E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN      将比下列SQL更有效率   SELECT *   FROM EMP E ,   LOCATION L ,   CATEGORY C   WHERE E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN   AND E.EMP_NO BETWEEN 1000 AND 2000      2.WHERE子句中的连接顺序      ORACLE采用自下而上的顺序解析WHERE子句      根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾      例如:   (低效,执行时间156.3秒)   SELECT *   FROM EMP E   WHERE SAL > 50000   AND JOB = 'MANAGER'   AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);      (高效,执行时间10.6秒)   SELECT *   FROM EMP E   WHERE 25 50000   AND JOB = 'MANAGER';      3.SELECT子句中避免使用'*'      当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用'*'是一个方便的方法,不幸的是,这是一个非常低效的方法      实际上,ORACLE在解析的过程中,会将'*'依次转换成所有的列名      这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间      4.减少访问数据库的次数