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=AAEAAAAWh2gBxianrbJd6zP6AcPCCdOABU
rV8Pw>
https://www.linkedin.com/profile/view?id=AAEAAAAWh2gBxianrbJd6zP6AcPCCdOABUr
V8Pw

 

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>
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/> 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.

 

Reply via email to