hadoop 127.0.0.1分区规则中为什么要乘一个127

Hadoop 表分区以及分区消除 - 推酷
Hadoop 表分区以及分区消除
Big SQL, 是 IBM 依托其在 RDBMS 领域多年的技术积累,并结合当前大数据领域许多先进技术推出的 SQL-on-Hadoop 产品。与市场上其它产品如 Hive 不同,Big SQL 通过在 Hadoop 上运行大规模并行处理 (MPP) SQL 引擎来替代 MapReduce,极大地提高了查询速度。Big SQL 以其无与伦比的 SQL 兼容性、丰富的企业及应用特性和各种数据源的联邦功能以及对 Hadoop 生态系统良好的支持性,为 SQL 开发人员提供了各种方式来查询和访问 Hadoop 管理的数据。内部测试表明,Big SQL 返回结果的速度比 Apache Hive 1.2 平均快 20 倍,对于个别查询而言,其性能提升了 10 到 70 倍。为了直观地演示,作者用最新 Big SQL 4.2 和 Hive 1.2.1 做了一个简单测试,创建一张 Hadoop 表 admission 并向其中加载
行数据,然后分别通过 Hive 和 Big SQL 来查询表中所有的记录数。
清单 1. Big SQL 测试查询示例
[bigsql] 1& SELECT COUNT(*) FROM+----------+| 1 |+----------+|
|+----------+1 row in results(first row: 0.979s; total: 0.980s)
清单 2. Hive 测试查询示例
hive& SELECT COUNT(*) FROMOKTime taken: 30.808 seconds, Fetched: 1 row(s)
在上述测试场景中,Big SQL 的查询速度比 Hive 快大约 30 倍,显示出 Big SQL 强大的查询性能以及相对于其它同类产品巨大的性能优势。本文将主要介绍 Big SQL 为了增强查询性能而引入的 Hadoop 表分区以及分区消除特性。
我们知道,Hive 是最早的 SQL-on-Hadoop 产品,并且开源,所以目前基本所有的 Hadoop 分发版本都包含了 Hive,IBM BigInsights 也包含了 Hive。在 Big SQL 中,我们除了可以定义普通 DB2 语法的表,还可以创建 Hadoop 表和 Hbase 表,其中 Hadoop 表就是通过 Hive Catalog 来定义的,数据存储在 Hive 中,其实质就是 Hive 表。基于前面提到的 Big SQL 相对于 Hive 所具有的性能优势,用户可以通过 Big SQL 高效查询存储在 Hive 数据仓库中的海量数据。
在 RDBMS 中,当数据量较大时,为了便于管理,经常需要创建和使用分区表。创建分区,实际上就是将表中的数据分成更小的子块,简单地说,就是把一张大表分成若干小表。每个分区可以单独管理,可以不依赖其他分区而单独发挥作用,因此可以提供更有利于可用性和性能的结构。创建分区之后,逻辑上表仍然保持其完整性,只是物理上将表中的数据存放到多个物理文件上。查询时可以通过适当的谓词过滤掉一些分区,而不需要每次都扫描整张表,从而获得查询性能的提升。
对于企业级用户,例如银行,需要将其过去十几年甚至几十年的历史交易数据存储在数据仓库中。现在假设一个场景,用户需要查询某个特定年份的交易信息,可以想象一下,面对海量的历史数据,如果用户每一次查询都需要扫描表中所有数据来得到符合条件的记录,那么其效率将会变得令人难以忍受。但是如果用户将数据按照交易时间进行分区存储和管理,那么查询时就只需要扫描特定时间分区中的数据,可以大大地节省查询时间。
Big SQL 支持表分区和分区消除,而对于 Hadoop 表,在最新的 4.2 版本中,除了支持基于列进行分区,还支持基于列表达式进行分区。所以对于上述场景,用户可以通过 Big SQL 基于列表达式分区的功能,利用 YEAR() 或 MONTH() 等时间函数基于已有的日期类型的列来定义分区。
Hadoop 分区表
在 Big SQL 中,Hadoop 表是通过 Hive Catalog 来定义的,数据也是存储在 Hive 中。创建 Hadoop 分区表并插入数据后,在分布式文件系统 (DFS) 上就会根据每个分区生成一个目录,表中每个分区的数据就存放在对应的目录下。对于有多个分区键的情况,则会根据分区键定义的顺序,逐层创建对应的目录,即根据第一个分区键创建一级目录,然后再根据第二个分区键在各个一级目录中创建二级目录,以此类推。
Big SQL 4.2 创建 Hadoop 分区表的基本语法如下所示。
清单 3. 创建 Hadoop 分区表基本语法
.-HADOOP----- &&-CREATE--+----+--+-----+--TABLE---+--table-name--& '-EXTERNAL-' '-IF NOT EXISTS-'
+-PARTITIONED BY -| partitioning-element-list |----+partitioning-element-list .-,-------------------. V ||--(--+-| column-definition |----+--)-----------|+-| partition-expression |-+partition-expression|--expression-AS-identifier--|
PARTITIONED BY 从句用来定义分区键,分区键可以是数据列本身,也可以是基于数据列的一些表达式。需要注意的是,如果以数据列的表达式作为分区键,要在前面先定义这些列。
Big SQL 4.2 中,下列数据类型的列不能作为分区键。
而基于列表达式的分区,支持但不限于下列表达式。
运算符: +, -, *, /
标量函数: MOD(), HASH(), SUBSTRING(), LEFT(), RIGHT(), YEAR(), MONTH(), DAY()
下列表达式不能作为分区表达式。
Subqueries
XMLQUERY or XMLEXISTS expressions
Column functions
Dereference operations or DEREF functions
User-defined or built-in functions that are non-deterministic
User-defined functions using the EXTERNAL ACTION option
User-defined functions that are not defined with NO SQL
Host variables or parameter markers
Special registers and built-in functions that depend on the value of a special register
Global variables
References to columns defined later in the column list
References to other generated columns
References to columns of type XML
下面通过一个实例来说明如何创建 Hadoop 分区表。在前面的场景介绍中我们提到了银行存储历史交易数据的例子,假设其交易流水信息如下表所示。
表 1. 银行交易流水信息
现在用户需要按照交易年份和月份来组织和管理这些数据,并同时按照交易类型把数据分类存储。基于用户需求,这里可以同时利用 Big SQL 基于列和列表达式分区的功能。首先通过 YEAR() 和 MONTH() 函数来定义两个基于交易时间的分区键,然后再直接将交易类型列定义为分区键。
清单 4. 创建 Hadoop 分区表示例
CREATE HADOOP TABLE transaction_info(T_id char(9) not null,C_id char(9) not null,B_id char(9) not null,S_id char(9) not null,T_time date not null,T_money decimal(20,3),PRIMARY KEY (T_id))PARTITIONED BY (YEAR(T_time) AS P_year,MONTH(T_time) AS P_month,T_type smallint not null);
创建好 Hadoop 分区表,只有在向数据表中加载数据之后,分布式文件系统上才会按照各个分区键的值生成对应目录。通常有三种方式向 Hadoop 表中加载数据,通过 INSERT 或者 LOAD 命令,也可以在创建表的语句中通过 LOCATION 从句来指定一个分布式文件系统的路径,然后将数据以文件的形式存放到该指定路径下。这里需要指出,对于基于列表达式的分区键,我们通过 INSERT 插入数据时,Big SQL 会根据表达式自动计算出分区值,但是对于 LOAD 或 LOCATION 命令,则需要用户事先根据表达式计算出正确的分区值并保存到数据文件中,且 Big SQL 不会校验这些数值是否正确。向上述分区表中插入几行数据。
清单 5. 插入数据示例
INSERT INTO transaction_infoVALUES('T','C','B','S','',,DEFAULT,DEFAULT,1),('T','C','B','S','',,DEFAULT,DEFAULT,3),('T','C','B','S','',,DEFAULT,DEFAULT,1),('T','C','B','S','',,DEFAULT,DEFAULT,2),('T','C','B','S','',,DEFAULT,DEFAULT,4),('T','C','B','S','',,DEFAULT,DEFAULT,1);
这里将两个基于列表达式的分区键的值指定为 DEFAULT, Big SQL 会根据前面定义的日期类型列的值自动通过表达式计算出这两个分区键对应的值。查看分区值是否计算正确。
清单 6. 查看数据示例
[bigsql] 1& SELECT T_id, T_time, P_year, P_month, T_type FROM transaction_info ORDER BY T_+---------+-----------+-------+--------+--------+| T_ID | T_TIME | P_YEAR | P_MONTH | T_TYPE |+--------+--------+-------+--------+-------+| T |
| 2008 | 1 | 1 || T |
| 2008 | 1 | 3 || T |
| 2008 | 12 | 1 || T |
| 2009 | 1 | 2 || T |
| 2010 | 1 | 4 || T |
| 2010 | 2 | 1 |+-------+---------+-------+--------+-------+6 rows in results(first row: 0.252s; total: 0.254s)
那么在向 Hadoop 分区表中加载数据之后,用户如何查看分区信息呢?这里提供三种方法。
Big SQL SYSHADOOP.HCAT_COLUMNS 视图列出了通过 Hive Catalogs 定义的 Hadoop 表的各个列的定义信息,通过该视图也可以查看分区键的相关信息。
清单 7. 通过 SYSHADOOP.HCAT_COLUMNS 查看分区信息示例
[bigsql] 1& SELECT col_name,partition FROM SYSHADOOP.HCAT_COLUMNS WHERE TABSCHEMA='BIGSQL' AND TABNAME='TRANSACTION_INFO';+----------+-----------+| COL_NAME | PARTITION |+----------+-----------+| t_id | N || c_id | N || b_id | N || s_id | N || t_time | N || t_money | N || p_year | Y || p_month | Y || t_type | Y |+----------+-----------+9 rows in results(first row: 0.056s; total: 0.057s)
PARTITION 列的值可以是“Y”或“N”,“Y”表示对应的列是分区键,“N”则表示不是分区键。通过 SYSHADOOP.HCAT_COLUMNS 视图并不能查看到表中有多少个分区,下面两种方式则可以查看具体的分区情况。
前面讲到,在分布式文件系统上会按照各个分区键定义的顺序逐层生成对应的目录,每个分区的数据分别存储在对应的目录下。所以如果用户需要知道 Hadoop 分区表的分区信息,可以通过相关的 Hadoop 命令在 HDFS 上查看。
清单 8. 通过 Hadoop 命令查看分区信息示例
$ hadoop fs -ls /apps/hive/warehouse/bigsql.db/transaction_infoFound 3 itemsdrwxrwx--- - bigsql hadoop 0
06:33 /apps/hive/warehouse/bigsql.db/transaction_info/p_year=2008drwxrwx--- - bigsql hadoop 0
06:33 /apps/hive/warehouse/bigsql.db/transaction_info/p_year=2009drwxrwx--- - bigsql hadoop 0
06:33 /apps/hive/warehouse/bigsql.db/transaction_info/p_year=2010
$ hadoop fs -ls
/apps/hive/warehouse/bigsql.db/transaction_info/p_year=2008
Found 2 items
drwxrwx--- -
bigsql hadoop 0
/apps/hive/warehouse/bigsql.db/transaction_info/p_year=2008
/p_month=1
drwxrwx--- - bigsql hadoop 0
/apps/hive/warehouse/bigsql.db/transaction_info/p_year=2008
/p_month=12
$ hadoop fs -ls
/apps/hive/warehouse/bigsql.db/transaction_info/p_year=2008/
Found 2 items
drwxrwx--- - bigsql hadoop 0
/apps/hive/warehouse/bigsql.db/transaction_info/p_year=2008
/p_month=1/t_type=1
drwxrwx--- - bigsql hadoop 0
/apps/hive/warehouse/bigsql.db/transaction_info/p_year=2008
/p_month=1/t_type=3
这里可以很明显地看出 HDFS 上各个分区键的层次结构。其中 bigsql.db 中 bigsql 是所创建的 Hadoop 表的 Schema,缺省情况下默认使用创建该表的用户的用户名为 Schema。通过 Hadoop 命令在 HDFS 上逐层查看分区,有时候并不那么直观,那么能不能直接将所有的分区全部列出来呢?因为在 Big SQL 中,Hadoop 表的实质是 Hive 表,所以我们也可以直接通过 Hive 命令来查看。
清单 9. 通过 Hive 查看分区信息示例
hive& SHOW PARTITIONS transaction_OKp_year=2008/p_month=1/t_type=1p_year=2008/p_month=1/t_type=3p_year=2008/p_month=12/t_type=1p_year=2009/p_month=1/t_type=2p_year=2010/p_month=1/t_type=4p_year=2010/p_month=2/t_type=1Time taken: 0.562 seconds, Fetched: 6 row(s)
创建和使用分区的目的之一就是希望在查询数据的时候通过适当的查询谓词来过滤掉一些分区,从而避免扫描所有数据,提高查询效率,这就是分区消除。在 Big SQL 4.2 中,分区消除有两个概念,除了一般意义上的分区消除,Big SQL 4.2 还引入了延时分区消除的概念,使得分区消除的适用场景更为广泛。
分区消除 (Partition Elimination) : Big SQL 根据分区策略和查询谓词,决定查询过程中过滤掉不必要扫描的分区。
延时分区消除 (Deferred Partition Elimination):通常在 Big SQL 中,早期当查询被注册的时候便可以决定过滤掉哪些分区,但在某些情况下,需要等到 Scan 打开以及查询工作被 Scheduler 部署到各个 Worker 节点之后,才能决定过滤掉哪些分区。
对于以数据列本身作为分区键的 Hadoop 分区表,用户在查询时只需要在分区键上添加适当的查询谓词,Big SQL 就可以实现分区消除。而对于以列表达式作为分区键的 Hadoop 分区表,如果表达式是通过单调函数定义的,当用户在原始数据列上添加了诸如&, &=, &, &=, = 或 in 等查询谓词,或者表达式通过非单调的确定性函数定义,用户在原始数据列上添加了= 或 in 等查询谓词,Big SQL 会根据表达式在对应的分区键上生成一个派生的查询谓词来实现分区消除。
设计一个场景,用户需要查询所有交易类型为“存款”的历史信息。
清单 10. 查询场景 1
SELECT * FROM transaction_info WHERE T_type = 1;
在上述查询中,当查询被注册时,优化器便可以根据查询谓词决定只需要扫描分区键 T_type 的值为 1 的分区,根据上面的分区情况可知,该场景下可以消除掉 1/2 的分区。
用户需要查询某个时间段的所有历史交易信息。
清单 11. 查询场景 2
SELECT * FROM transaction_info WHERE T_time &= '';
下面是通过相关命令查看到的在这个查询中 Big SQL 实际使用了哪些查询谓词。
清单 12. 查询场景 2 谓词
PREDICATE_TEXT ----------------------------------------(Q1.P_YEAR &= 2008) (Q1.T_TIME &= '12/12/2008')
2 record(s) selected.
2 record(s) selected.
可以看到除了原始数据列上的查询谓词,Big SQL 还根据分区表达式在分区键 P_year 上生成了一个派生查询谓词。这里就有一个问题了,P_year 和 P_month 都是基于日期列 T_time 的表达式定义的,为什么这里只在 P_year 上生成了派生查询谓词?原因就是前面讲到的,YEAR() 基于年份是单调的,但是 MONTH() 基于月份却不能被认为是单调的。
再设计一个场景。现在用户需要查询一些不连续的年份里的历史交易信息,用户创建了一张表 filter_table_year,表中只有一个数据列 filter_col_year 用来保存需要过滤的年份。假设向表 filter_table_year 中插入了两个年份 2008 和 2009,查询如下。
清单 13. 查询场景 3
SELECT * FROM transaction_info t, filter_table_year f WHERE t.P_year=f.filter_col_
同样先通过相关命令查看这个查询中的查询谓词。
清单 14. 查询场景 3 谓词
PREDICATE_TEXT ----------------------------------------(Q2.P_YEAR &= $INTERNAL_FUNC$()) (Q2.P_YEAR = Q1.FILTER_COL_YEAR) (Q2.P_YEAR &= $INTERNAL_FUNC$())
3 record(s) selected.
在这个查询中同样生成了两个新的查询谓词,这实际上也是 Big SQL 4.2 的一个新特性,这里不做详细说明。其中函数 $INTERNAL_FUNC$() 实际上是用来计算来自表 filter_table_year 中参与连接的列 filter_col_year 的最大值和最小值的。通过计算出这两个值并添加到查询谓词上,就可以确定需要查找的分区范围,实现分区消除。但是 $INTERNAL_FUNC$() 的值需要等到 Scan 打开以及查询工作被 Scheduler 部署到各个 worker 节点之后才能被计算出来,所以称为延时分区消除。
查看分区消除
用户如何查看在一次查询中有没有发生分区消除以及消除了多少分区呢?在 Big SQL 中,用户可以通过 Scheduler 的日志文件来查看分区消除信息。
如果需要查看一个查询的分区消除信息,首先需要修改配置文件 '$BIGSQL_HOME/conf/log4j-sched.properties',通过去掉下列内容中的注释符 # 来设置 Debug 模式。
清单 15. 设置 Debug 模式
# .ibm=ALL
然后重启 Big SQL Scheduler 使设置生效。
清单 16. 重启 Big SQL Scheduler
cd /usr/ibmpacks/bigsql/4.2.0.0/bigsql/./bigsql stop -./bigsql start -
设置完成之后,提交查询,分区消除信息就会被写入 '/var/ibm/bigsql/logs/bigsql-sched.log' 中。当然,更为简单的方法是,用户还可以通过命令来收集分区信息而不需要去日志文件中查找, 以前面查询场景 3 为例。
清单 17. 查看分区消除信息示例
$BIGSQL_HOME/libexec/sched internal resetDiagInfo 2&/dev/db2 &SELECT * FROM transaction_info t, filter_table_year f WHERE t.P_year=f.filter_col_year&;T_ID C_ID B_ID S_ID T_TIME T_MONEY P_YEAR P_MONTH T_TYPE FILTER_COL_YEAR------ ---------- ---------------------- ----------- T/21/.000
2008T/01/.000
2008T/12/.560
2009T/12/.000
2008 4 record(s) selected.$BIGSQL_HOME/libexec/sched internal getPartitionEliminationInfo 2&/dev/SchemaName.TableName eliminated/totalbigsql.transaction_info 2/6Aggregated Total: 2/6
上面示例中,第一个语句的作用是清空之前的分区消除日志信息,然后提交查询,接下来就可以通过第三个语句来收集分区消除信息了。根据收集到的信息可以看到,通过分区消除过滤掉了 6 个分区中的 2 个。
虽然设计分区表,通过分区消除可以过滤掉一些不需要扫描的分区,但这并不意味着任何时候都能带来查询性能的提升,用户需要根据实际的场景,合理地选择和使用 Big SQL Hadoop 表的分区功能。通常如果用户决定使用分区功能,在向 Hadoop 分区表中加载数据之后,用户可能需要运行 ANALYZE 命令来收集表中相关列的统计信息,帮助 Big SQL 优化器选择更优的访问方案。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致966,690 十二月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
除Hadoop外你还需要知道的9个大数据技术
除Hadoop外你还需要知道的9个大数据技术
欲知区块链、VR、TensorFlow等潮流技术和框架,请锁定
相关厂商内容
相关赞助商
QCon北京-18日,北京&国家会议中心,
Flink受到了MPP数据库技术(Declaratives、Query Optimizer、Parallel in-memory、out-of-core 算法)和Hadoop MapReduce技术(Massive scale out, User Defined functions, Schema on Read)的启发,有很多独特功能(Streaming, Iterations, Dataflow, General API)。
Apache Samza:是一个开源、分布式的流处理框架,它使用开源分布式消息处理系统Apache Kafka来实现消息服务,并使用资源管理器Apache Hadoop Yarn实现容错处理、处理器隔离、安全性和资源管理。
该技术由LinkedIn开发,最初目的是为了解决Apache Kafka在扩展能力方面存在的问题,包含诸如Simple API、Managed state、Fault Tolerant、Durable messaging、Scalable、Extensible,以及Processor Isolation等功能。
Samza的代码可作为Yarn作业运行,还可以实施StreamTask接口,借此定义process()调用。StreamTask可以在任务实例内部运行,其本身也位于一个Yarn容器内。
Cloud Dataflow:Dataflow是一种原生的Google Cloud数据处理服务,是一种构建、管理和优化复杂数据流水线的方法,用于构建移动应用,调试、追踪和监控产品级云应用。它采用了Google内部的技术Flume和MillWhell,其中Flume用于数据的高效并行化处理,而MillWhell则用于互联网级别的带有很好容错机制的流处理。
该技术提供了简单的编程模型,可用于批处理和流式数据的处理任务。该技术提供的数据流管理服务可控制数据处理作业的执行,数据处理作业可使用Data Flow SDK(Apache Beam)创建。
Google Data Flow为数据相关的任务提供了管理、监视和安全能力。Sources和Sink可在管线中抽象地执行读写操作,管线封装而成的整个计算序列可以接受外部来源的某些输入数据,通过对数据进行转换生成一定的输出数据。
StreamSets:StreamSets是一种专门针对传输中数据进行过优化的数据处理平台,提供了可视化数据流创建模型,通过开源的方式发行。该技术可部署在内部环境或云中,提供了丰富的监视和管理界面。
数据收集器可使用数据管线实时地流式传输并处理数据,管线描述了数据从源头到最终目标的流动方式,可包含来源、目标,以及处理程序。数据收集器的生命周期可通过管理控制台进行控制。
TensorFlow:是继DistBelief之后的第二代机器学习系统。TensorFlow源自Google旗下的Google Brain项目,主要目标在于为Google全公司的不同产品和服务应用各种类型的神经网络机器学习能力。
支持分布式计算的TensorFlow能够使用户在自己的机器学习基础结构中训练分布式模型。该系统以高性能的gRPC数据库为支撑,与最近发布的Google云机器学习系统互补,使用户能够利用Google云平台,对TensorFlow模型进行训练并提供服务。
这是一种开源软件库,可使用数据流图谱(data flow graph)进行数值运算,这种技术已被包括DeepDream、RankBrain、Smart Replyused在内的各种Google项目所使用。
数据流图谱使用由节点(Node)和边缘(Edge)组成的有向图(Directed graph)描述数值运算。图谱中的节点代表数值运算,边缘代表负责在节点之间进行通信的多维数据阵列(张量,Tensor)。边缘还描述了节点之间的输入/输出关系。“TensorFlow”这个名称蕴含了张量在图谱上流动的含义。
Druid:Druid是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析,诞生于2011年,包含诸如驱动交互式数据应用程序,多租户:大量并发用户,扩展能力:每天上万亿事件,次秒级查询,实时分析等功能。Druid还包含一些特殊的重要功能,例如低延迟数据摄入、快速聚合、任意切割能力、高可用性、近似计算与精确计算等。
创建Druid的最初意图主要是为了解决查询延迟问题,当时试图使用Hadoop来实现交互式查询分析,但是很难满足实时分析的需要。而Druid提供了以交互方式访问数据的能力,并权衡了查询的灵活性和性能而采取了特殊的存储格式。
(点击放大图像)
该技术还提供了其他实用功能,例如实时节点、历史节点、Broker节点、Coordinator节点、使用基于JSON查询语言的索引服务。
Apache NiFi:Apache NiFi是一套强大可靠的数据处理和分发系统,可用于对数据的流转和转换创建有向图。借助该系统可以用图形界面创建、监视、控制数据流,有丰富的配置选项可供使用,可在运行时修改数据流,动态创建数据分区。此外还可以对数据在整个系统内的流动进行数据起源跟踪。通过开发自定义组件,还可轻松对其进行扩展。
(点击放大图像)
Apache NiFi的运转离不开诸如FlowFile、Processor,以及Connection等概念。
LinkedIn WhereHows:WhereHows提供带元数据搜索的企业编录(Enterprise catalog),可以让您了解数据存储在哪里,是如何保存到那里的。该工具可提供协作、数据血统分析等功能,并可连接至多种数据源和提取、加载和转换(ETL)工具。
(点击放大图像)
该工具为数据发现提供了Web界面,支持API的后端服务器负责控制元数据的爬网(Crawling)以及与其他系统的集成。
Microsoft Cognitive Services:该技术源自Project Oxford和Bing,提供了22种认知计算API,主要分类包括:视觉、语音、语言、知识,以及搜索。该技术已集成于Cortana Intelligence Suite。
(点击放大图像)
这是一种开源技术,提供了22种不同的认知计算REST API,并为开发者提供了适用于Windows、IOS、Android以及Python的SDK。
感谢对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至。也欢迎大家通过新浪微博(,),微信(微信号:)关注我们。
Author Contacted
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
InfoQ每周精要
通过个性化定制的新闻邮件、RSS Feeds和InfoQ业界邮件通知,保持您对感兴趣的社区内容的时刻关注。
架构 & 设计
文化 & 方法
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?
我们发现您在使用ad blocker。
我们理解您使用ad blocker的初衷,但为了保证InfoQ能够继续以免费方式为您服务,我们需要您的支持。InfoQ绝不会在未经您许可的情况下将您的数据提供给第三方。我们仅将其用于向读者发送相关广告内容。请您将InfoQ添加至白名单,感谢您的理解与支持。hive中partition如何使用 - 心如大海 - ITeye技术网站
博客分类:
网上有篇关于hive的partition的使用讲解的比较好,转载了:
1、在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。
2、分区表指的是在创建表时指定的partition的分区空间。
3、如果需要创建有分区的表,需要在create表的时候调用可选参数partitioned by,详见表创建的语法结构。
二、技术细节
1、一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
2、表和列名不区分大小写。
3、分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。
4、建表的语法(建分区可参见PARTITIONED BY参数):
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]
5、分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多文件夹嵌套模式。
a、单分区建表语句:create table day_table (id int, content string) partitioned by (dt string);单分区表,按天分区,在表结构中存在id,content,dt三列。
b、双分区建表语句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string);双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
表文件夹目录示意图(多分区表):
6、添加分区表语法(表已创建,在此基础上添加分区):
ALTER TABLE table_name ADD partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ... partition_spec: : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
用户可以用 ALTER TABLE ADD PARTITION 来向一个表中增加分区。当分区名是字符串时加引号。例:
ALTER TABLE day_table ADD PARTITION (dt='', hour='08') location '/path/pv1.txt' PARTITION (dt='', hour='09') location '/path/pv2.txt';
7、删除分区语法:
ALTER TABLE table_name DROP partition_spec, partition_spec,...
用户可以用 ALTER TABLE DROP PARTITION 来删除分区。分区的元数据和数据将被一并删除。例:
ALTER TABLE day_hour_table DROP PARTITION (dt='', hour='09');
8、数据加载进分区表中语法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
LOAD DATA INPATH '/user/pv.txt' INTO TABLE day_hour_table PARTITION(dt='', hour='08'); LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hour partition(dt='');
当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录,文件存放在该分区下。
9、基于分区的查询的语句:
SELECT day_table.* FROM day_table WHERE day_table.dt&= '';
10、查看分区语句:
hive& show partitions day_hour_ OK dt=/hour=08 dt=/hour=09 dt=/hour=09
1、在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在最字集的目录中。
2、总的说来partition就是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照一定的规格和条件进行管理。
浏览 47462
浏览: 716143 次
来自: 北京
支持一下,心如大海
山东分公司的风格[color=brown]岁的法国电视[/co ...
-services &services-config ...
有参考价值。}

我要回帖

更多关于 hadoop 分区面试题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信