hive-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jörn Franke <jornfra...@gmail.com>
Subject Re: Impact of partitioning on certain queries
Date Fri, 08 Jan 2016 08:49:14 GMT
Well you use a text format for your data so you should not be surprised. For text based formats,
such as csv, you can always use the hive bitmap index. I do not think it makes a lot of sense
to compare here processing csv files and internal tables of a relational database.

> On 08 Jan 2016, at 09:30, Mich Talebzadeh <mich@peridale.co.uk> wrote:
> 
> Well that is debatable.
>  
> The following table sales is partitioned in Oracle but has local bitmap indexes that
help the query.
>  
> select * from sales where prod_id = 10;
>  
> no rows selected
>  
>  
> Execution Plan
> ----------------------------------------------------------
> Plan hash value: 511273406
>  
> ---------------------------------------------------------------------------------------------------------------------
> | Id  | Operation                          | Name           | Rows  | Bytes | Cost (%CPU)|
Time     | Pstart| Pstop |
> ---------------------------------------------------------------------------------------------------------------------
> |   0 | SELECT STATEMENT                   |                |   347 | 10063 |    93 
 (0)| 00:00:02 |       |       |
> |   1 |  PARTITION RANGE ALL               |                |   347 | 10063 |    93 
 (0)| 00:00:02 |     1 |    28 |
> |   2 |   TABLE ACCESS BY LOCAL INDEX ROWID| SALES          |   347 | 10063 |    93 
 (0)| 00:00:02 |     1 |    28 |
> |   3 |    BITMAP CONVERSION TO ROWIDS     |                |       |       |       
    |          |       |       |
> |*  4 |     BITMAP INDEX SINGLE VALUE      | SALES_PROD_BIX |       |       |       
    |          |     1 |    28 |
> ---------------------------------------------------------------------------------------------------------------------
>  
> Obviously at this stage we do not have local indexes in Hive. That could make it moredefficient
for search and IMO will be a great tool.
>  
> Cheers,
>  
>  
> Dr Mich Talebzadeh
>  
> LinkedIn  https://www.linkedin.com/profile/view?id=AAEAAAAWh2gBxianrbJd6zP6AcPCCdOABUrV8Pw
>  
> Sybase ASE 15 Gold Medal Award 2008
> A Winning Strategy: Running the most Critical Financial Data on ASE 15
> http://login.sybase.com/files/Product_Overviews/ASE-Winning-Strategy-091908.pdf
> Author of the books "A Practitioner’s Guide to Upgrading to Sybase ASE 15", ISBN 978-0-9563693-0-7.
> co-author "Sybase Transact SQL Guidelines Best Practices", ISBN 978-0-9759693-0-4
> Publications due shortly:
> Complex Event Processing in Heterogeneous Environments, ISBN: 978-0-9563693-3-8
> Oracle and Sybase, Concepts and Contrasts, ISBN: 978-0-9563693-1-4, volume one out shortly
>  
> http://talebzadehmich.wordpress.com
>  
> NOTE: The information in this email is proprietary and confidential. This message is
for the designated recipient only, if you are not the intended recipient, you should destroy
it immediately. Any information in this message shall not be understood as given or endorsed
by Peridale Technology Ltd, its subsidiaries or their employees, unless expressly so stated.
It is the responsibility of the recipient to ensure that this email is virus free, therefore
neither Peridale Ltd, its subsidiaries nor their employees accept any responsibility.
>  
> From: Jörn Franke [mailto:jornfranke@gmail.com] 
> Sent: 08 January 2016 06:20
> To: user@hive.apache.org
> Subject: Re: Impact of partitioning on certain queries
>  
> This observation is correct and it is the same  behavior as you see it in other databases
supporting partitions. Usually you should avoid many small partitions.
> 
> On 07 Jan 2016, at 23:53, Mich Talebzadeh <mich@peridale.co.uk> wrote:
> 
> Ok we hope that partitioning improves performance where the predicate is on partitioned
columns
>  
> I have two tables. One a basic table called smallsales defined as below
>  
> CREATE TABLE `smallsales`(                                              |
> |   `prod_id` bigint,                                                     |
> |   `cust_id` bigint,                                                     |
> |   `time_id` timestamp,                                                  |
> |   `channel_id` bigint,                                                  |
> |   `promo_id` bigint,                                                    |
> |   `quantity_sold` decimal(10,0),                                        |
> |   `amount_sold` decimal(10,0))                                          |
> | ROW FORMAT SERDE                                                        |
> |   'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'                  |
> | STORED AS INPUTFORMAT                                                   |
> |   'org.apache.hadoop.mapred.TextInputFormat'                            |
> | OUTPUTFORMAT                                                            |
> |   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'          |
> | LOCATION                                                                |
> |   'hdfs://rhes564:9000/user/hive/warehouse/oraclehadoop.db/smallsales'  |
> | TBLPROPERTIES (                                                         |
> |   'COLUMN_STATS_ACCURATE'='true',                                       |
> |   'last_modified_by'='hduser',                                          |
> |   'last_modified_time'='1451644705',                                    |
> |   'numFiles'='1',                                                       |
> |   'numRows'='5000000',                                                  |
> |   'rawDataSize'='193437457',                                            |
> |   'totalSize'='198437457',                                              |
> |   'transient_lastDdlTime'='1451784743')                                 |
> +-------------------------------------------------------------------------+--+
>  
>  
> So 5 million rows.
>  
>  
> I then created a partitioned table called sales as below
>  
> |                                createtab_stmt                                 |
> +-------------------------------------------------------------------------------+--+
> | CREATE TABLE `sales`(                                                         |
> |   `prod_id` bigint,                                                           |
> |   `cust_id` bigint,                                                           |
> |   `time_id` timestamp,                                                        |
> |   `channel_id` bigint,                                                        |
> |   `promo_id` bigint,                                                          |
> |   `quantity_sold` decimal(10,0),                                              |
> |   `amount_sold` decimal(10,0))                                                |
> | PARTITIONED BY (                                                              |
> |   `year` int,                                                                 |
> |   `month` int)                                                                |
> | CLUSTERED BY (                                                                |
> |   prod_id,                                                                    |
> |   cust_id,                                                                    |
> |   time_id,                                                                    |
> |   channel_id,                                                                 |
> |   promo_id)                                                                   |
> | INTO 256 BUCKETS                                                              |
> | 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'                          |
> | LOCATION                                                                      |
> |   'hdfs://rhes564:9000/user/hive/warehouse/oraclehadoop.db/sales'             |
> | TBLPROPERTIES (                                                               |
> |   'orc.bloom.filter.columns'='PROD_ID,CUST_ID,TIME_ID,CHANNEL_ID,PROMO_ID',   |
> |   'orc.bloom.filter.fpp'='0.05',                                              |
> |   'orc.compress'='SNAPPY',                                                    |
> |   'orc.create.index'='true',                                                  |
> |   'orc.row.index.stride'='10000',                                             |
> |   'orc.stripe.size'='268435456',                                              |
> |   'transient_lastDdlTime'='1451814921')                                       |
> +-------------------------------------------------------------------------------+--+
>  
> And loaded data from smallsales to sales table
>  
> Stats updated in both
>  
> Now when I do the following
>  
> 0: jdbc:hive2://rhes564:10010/default> select * from smallsales where prod_id = 10;
> +---------------------+---------------------+---------------------+------------------------+----------------------+---------------------------+-------------------------+--+
> | smallsales.prod_id  | smallsales.cust_id  | smallsales.time_id  | smallsales.channel_id
 | smallsales.promo_id  | smallsales.quantity_sold  | smallsales.amount_sold  |
> +---------------------+---------------------+---------------------+------------------------+----------------------+---------------------------+-------------------------+--+
> +---------------------+---------------------+---------------------+------------------------+----------------------+---------------------------+-------------------------+--+
> No rows selected (2.231 seconds)
>  
> Ok if I do the same query from partitioned bucketed table in takes
>  
> 0: jdbc:hive2://rhes564:10010/default> select * from sales where prod_id = 10;
> +----------------+----------------+----------------+-------------------+-----------------+----------------------+--------------------+-------------+--------------+--+
> | sales.prod_id  | sales.cust_id  | sales.time_id  | sales.channel_id  | sales.promo_id
 | sales.quantity_sold  | sales.amount_sold  | sales.year  | sales.month  |
> +----------------+----------------+----------------+-------------------+-----------------+----------------------+--------------------+-------------+--------------+--+
> +----------------+----------------+----------------+-------------------+-----------------+----------------------+--------------------+-------------+--------------+--+
> No rows selected (26.96 seconds)
>  
>  
> Note that the second query is order of magnitude slower.
>  
> My view is that the query in partitioned table has got to go through every partitioned
file to check the existence of the value, whereas in a non-partitioned table the operation
is much faster.  Adding more partition and buckets also adds more load on NameNode as well.
>  
> Are there other reasons?
>  
> Thanks
>  
>  
>  
> Dr Mich Talebzadeh
>  
> LinkedIn  https://www.linkedin.com/profile/view?id=AAEAAAAWh2gBxianrbJd6zP6AcPCCdOABUrV8Pw
>  
> Sybase ASE 15 Gold Medal Award 2008
> A Winning Strategy: Running the most Critical Financial Data on ASE 15
> http://login.sybase.com/files/Product_Overviews/ASE-Winning-Strategy-091908.pdf
> Author of the books "A Practitioner’s Guide to Upgrading to Sybase ASE 15", ISBN 978-0-9563693-0-7.
> co-author "Sybase Transact SQL Guidelines Best Practices", ISBN 978-0-9759693-0-4
> Publications due shortly:
> Complex Event Processing in Heterogeneous Environments, ISBN: 978-0-9563693-3-8
> Oracle and Sybase, Concepts and Contrasts, ISBN: 978-0-9563693-1-4, volume one out shortly
>  
> http://talebzadehmich.wordpress.com
>  
> NOTE: The information in this email is proprietary and confidential. This message is
for the designated recipient only, if you are not the intended recipient, you should destroy
it immediately. Any information in this message shall not be understood as given or endorsed
by Peridale Technology Ltd, its subsidiaries or their employees, unless expressly so stated.
It is the responsibility of the recipient to ensure that this email is virus free, therefore
neither Peridale Ltd, its subsidiaries nor their employees accept any responsibility.
>  

Mime
View raw message