Hi Jorn,

 

Thanks for your reply. My Hive version is 1.2.1 on Spark 1.3.1. I have not 
tried it on TEZ. I tried the query on MR engine and it did nor fair better. I 
also ran it without SDDDEV function and found out that the function did not 
slow it down.

 

I tried a simple query as follows builr in sales FACT table 1e9 rows and 
dimension table times (1826 rows)

 

--

-- Get the total amount sold for each calendar month

--

SELECT t.calendar_month_desc, SUM(s.amount_sold)

FROM sales s, times t WHERE s.time_id = t.time_id

GROUP BY t.calendar_month_desc;

 

Now Sybase IQ comes back in around 30 seconds. 

 

Started query at Dec 30 2015 08:14:33:399AM

(48 rows affected)

Finished query at Dec 30 2015 08:15:04:640AM

 

Whereas Hive with the following setting and running the same query

 

set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

set hive.optimize.bucketmapjoin=true;

set hive.optimize.bucketmapjoin.sortedmerge=true;

 

Comes back in 

 

48 rows selected (1514.687 seconds)

 

I don’t know what else can be done. Obviously this is all schema on read so I 
am not sure I can change bucketing on FACT table based on one query alone!

 

 

 

+--------------------------------------------------------------------+--+

|                           createtab_stmt                           |

+--------------------------------------------------------------------+--+

| CREATE TABLE `times`(                                              |

|   `time_id` timestamp,                                             |

|   `day_name` varchar(9),                                           |

|   `day_number_in_week` int,                                        |

|   `day_number_in_month` int,                                       |

|   `calendar_week_number` int,                                      |

|   `fiscal_week_number` int,                                        |

|   `week_ending_day` timestamp,                                     |

|   `week_ending_day_id` bigint,                                     |

|   `calendar_month_number` int,                                     |

|   `fiscal_month_number` int,                                       |

|   `calendar_month_desc` varchar(8),                                |

----------

|   `days_in_fis_year` bigint,                                       |

|   `end_of_cal_year` timestamp,                                     |

|   `end_of_fis_year` timestamp)                                     |

| CLUSTERED BY (                                                     |

|   time_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/times'  |

| TBLPROPERTIES (                                                    |

|   'COLUMN_STATS_ACCURATE'='true',                                  |

|   'numFiles'='1',                                                  |

|   'numRows'='1826',                                                |

|   'orc.bloom.filter.columns'='TIME_ID',                            |

|   'orc.bloom.filter.fpp'='0.05',                                   |

|   'orc.compress'='SNAPPY',                                         |

|   'orc.create.index'='true',                                       |

|   'orc.row.index.stride'='10000',                                  |

|   'orc.stripe.size'='268435456',                                   |

|   'rawDataSize'='0',                                               |

|   'totalSize'='11155',                                             |

|   'transient_lastDdlTime'='1451429900')                            |

 

;

 

 

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

 

From: Jörn Franke [mailto:jornfra...@gmail.com] 
Sent: 30 December 2015 08:28
To: user@hive.apache.org
Subject: Re: Running the same query on 1 billion rows fact table in Hive on 
Spark compared to Sybase IQ columnar database

 

Have you tried it with Hive ob TEZ? It contains (currently) more optimizations 
than Hive on Spark.

I assume you use the latest Hive version.

Additionally you may want to think about calculating statistics (depending on 
your configuration you need to trigger it) - I am not sure if Spark can use 
them.

I am not sure if bloom filters on the columns you mention make sense. You may 
also want to increase stride size (depending on your data).

Currently you bucket by a lot of fields, which may not make sense. You also may 
want to sort the data by customer Id in the table.

You also seem to have a lot of reducers, which you may want to decrease.

 

Have you tried without "having stddev_samp" ? Is the query exactly the same as 
in Sybase?


On 29 Dec 2015, at 11:53, Mich Talebzadeh <m...@peridale.co.uk 
<mailto:m...@peridale.co.uk> > wrote:

Hi,

 

I have a fact table in Hive imported from Sybase IQ via SQOOP with 1 billion 
rows as follows:

 

show create table sales;

+-------------------------------------------------------------------------------+--+

|                                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))                                                
|

| 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 (                                                               
|

|   'COLUMN_STATS_ACCURATE'='true',                                             
|

|   'last_modified_by'='hduser',                                                
|

|   'last_modified_time'='1451305626',                                          
|

|   'numFiles'='11',                                                            
|

|   'numRows'='1000000000',                                                     
|

|   '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',                                              
|

|   'rawDataSize'='296000000000',                                               
|

|   'totalSize'='2678882153',                                                   
|

|   'transient_lastDdlTime'='1451305626')                                       
|

+-------------------------------------------------------------------------------+--+

 

I use the following query to run against sales table only against Hive

 

SELECT

          rs.Customer_ID

        , rs.Number_of_orders

        , rs.Total_customer_amount

        , rs.Average_order

        , rs.Standard_deviation

FROM

(

        SELECT cust_id AS Customer_ID,

        COUNT(amount_sold) AS Number_of_orders,

        SUM(amount_sold) AS Total_customer_amount,

        AVG(amount_sold) AS Average_order,

        stddev_samp(amount_sold) AS Standard_deviation

        FROM sales

        GROUP BY cust_id

        HAVING SUM(amount_sold) > 94000

        AND AVG(amount_sold) < stddev_samp(amount_sold)

) rs

ORDER BY

          -- Total_customer_amount DESC

          3 DESC

 

Hive comes back in 17 minutes with 5,948 rows

 

bl -f sales.hql > sales.log

Connecting to jdbc:hive2://rhes564:10010/default

Connected to: Apache Hive (version 1.2.1)

Driver: Hive JDBC (version 1.2.1)

Transaction isolation: TRANSACTION_REPEATABLE_READ

Running init script /home/hduser/dba/bin/hive_on_spark_init.hql

No rows affected (0.097 seconds)

No rows affected (0.001 seconds)

No rows affected (0.001 seconds)

No rows affected (0.038 seconds)

INFO  : Warning: Using constant number 3 in order by. If you try to use 
position alias when hive.groupby.orderby.position.alias is false, the position 
alias will be ignored.

INFO  :

Query Hive on Spark job[0] stages:

INFO  : 0

INFO  : 1

INFO  : 2

INFO  :

Status: Running (Hive on Spark job[0])

INFO  : Job Progress Format

CurrentTime StageId_StageAttemptId: 
SucceededTasksCount(+RunningTasksCount-FailedTasksCount)/TotalTasksCount 
[StageCost]

INFO  : 2015-12-29 09:33:25,815 Stage-0_0: 0/11 Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:33:28,829 Stage-0_0: 0/11 Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:33:31,857 Stage-0_0: 0(+2)/11     Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:33:34,875 Stage-0_0: 0(+2)/11     Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:33:37,903 Stage-0_0: 0(+2)/11     Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:33:40,918 Stage-0_0: 0(+2)/11     Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:33:43,939 Stage-0_0: 0(+2)/11     Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:33:46,958 Stage-0_0: 0(+2)/11     Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:33:49,971 Stage-0_0: 0(+2)/11     Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:33:52,991 Stage-0_0: 0(+2)/11     Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:33:56,007 Stage-0_0: 0(+2)/11     Stage-1_0: 0/1009       
Stage-2_0: 0/1

 

INFO  : 2015-12-29 09:50:03,578 Stage-0_0: 10(+1)/11    Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:06,590 Stage-0_0: 10(+1)/11    Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:09,602 Stage-0_0: 10(+1)/11    Stage-1_0: 0/1009       
Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:10,606 Stage-0_0: 11/11 Finished       Stage-1_0: 
0(+2)/1009   Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:11,610 Stage-0_0: 11/11 Finished       Stage-1_0: 
6(+2)/1009   Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:12,618 Stage-0_0: 11/11 Finished       Stage-1_0: 
30(+2)/1009  Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:13,622 Stage-0_0: 11/11 Finished       Stage-1_0: 
59(+2)/1009  Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:14,626 Stage-0_0: 11/11 Finished       Stage-1_0: 
90(+2)/1009  Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:15,631 Stage-0_0: 11/11 Finished       Stage-1_0: 
124(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:16,654 Stage-0_0: 11/11 Finished       Stage-1_0: 
160(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:17,659 Stage-0_0: 11/11 Finished       Stage-1_0: 
193(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:18,663 Stage-0_0: 11/11 Finished       Stage-1_0: 
228(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:19,667 Stage-0_0: 11/11 Finished       Stage-1_0: 
262(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:20,672 Stage-0_0: 11/11 Finished       Stage-1_0: 
298(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:21,679 Stage-0_0: 11/11 Finished       Stage-1_0: 
338(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:22,687 Stage-0_0: 11/11 Finished       Stage-1_0: 
376(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:23,691 Stage-0_0: 11/11 Finished       Stage-1_0: 
417(+3)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:24,696 Stage-0_0: 11/11 Finished       Stage-1_0: 
460(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:25,699 Stage-0_0: 11/11 Finished       Stage-1_0: 
502(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:26,707 Stage-0_0: 11/11 Finished       Stage-1_0: 
542(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:27,712 Stage-0_0: 11/11 Finished       Stage-1_0: 
584(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:28,719 Stage-0_0: 11/11 Finished       Stage-1_0: 
624(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:29,730 Stage-0_0: 11/11 Finished       Stage-1_0: 
667(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:30,736 Stage-0_0: 11/11 Finished       Stage-1_0: 
709(+3)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:31,740 Stage-0_0: 11/11 Finished       Stage-1_0: 
754(+3)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:32,743 Stage-0_0: 11/11 Finished       Stage-1_0: 
797(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:33,747 Stage-0_0: 11/11 Finished       Stage-1_0: 
844(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:34,754 Stage-0_0: 11/11 Finished       Stage-1_0: 
888(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:35,759 Stage-0_0: 11/11 Finished       Stage-1_0: 
934(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:36,764 Stage-0_0: 11/11 Finished       Stage-1_0: 
981(+2)/1009 Stage-2_0: 0/1

INFO  : 2015-12-29 09:50:37,768 Stage-0_0: 11/11 Finished       Stage-1_0: 
1009/1009 Finished   Stage-2_0: 0(+1)/1

INFO  : 2015-12-29 09:50:38,771 Stage-0_0: 11/11 Finished       Stage-1_0: 
1009/1009 Finished   Stage-2_0: 1/1 Finished

INFO  : Status: Finished successfully in 1036.00 seconds

5,948 rows selected (1074.817 seconds)

 

So it returns 5948 rows in 17 minutes. In contrast IQ returns 5947 rows in 23 
seconds

 

Sybase IQ is a columnar database so each column is created as a fast projection 
index by default. In addition I have created LF (bitmap) indexes on dimension 
columns (PROD_ID, CUST_ID, TIME_ID, CHANNEL_ID, PROMO_ID). Now the query only 
touches CUST_ID.

 

My suspicion is that it is the Standard Deviation function stddev_samp() that 
could be the bottleneck?

 

Thanks

 

Mich Talebzadeh

 

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