You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@hive.apache.org by Brad Ruderman <br...@radiumone.com> on 2013/07/29 19:38:22 UTC

Best Performance on Large Scale Join

Hi All-

I have 2 tables:

CREATE TABLE users (
a bigint,
b int
)

CREATE TABLE products (
a bigint,
c int
)

Each table has about 8 billion records (roughly 2k files total mappers). I
want to know the most performant way to do the following query:

SELECT u.b,
              p.c,
              count(*) as count
FROM users u
INNER JOIN products p
ON u.a = p.a
GROUP BY u.b, p.c

Right now the reducing is killing me. Any suggestions on improving
performance? Would a mapbucket join be optimal here?

Thanks,
Brad

Re: Best Performance on Large Scale Join

Posted by Brad Ruderman <br...@radiumone.com>.
Hi Michael and Nitin-
Thanks for your response. Some things to note:

Michael-
I will definitely try this method, it looks interesting.

Nitin -
-Users Table and Product Tables are already unique.
-I cannot partition the data, since the data is coming from already
partitioned tables and I am doing a "monthly" overlap. Meaning I am looking
at users and products for a month's worth of data
-I am not sure what i means to be a "good" column to bucket, but I would
think user (as a bigint) would be a good column.

Others-
The other question is do you think I could improve performance by using PIG
LATIN instead of hive?

Thanks,
Brad



On Mon, Jul 29, 2013 at 10:59 AM, Nitin Pawar <ni...@gmail.com>wrote:

> Brad,
> whats the cluster capacity you have got?
> how many uniq values of a,b  and c  you have got individually in any of
> the one table?
>
>
> Is there any chance you can partition data? are there any columns you have
> on which you can create buckets?
>
> I have done joins having 10 billion records in one table but other table
> was significantly smaller. and I had a 1000 node cluster ad disposal
>
>
>
>
>
> On Mon, Jul 29, 2013 at 11:08 PM, Brad Ruderman <br...@radiumone.com>wrote:
>
>> Hi All-
>>
>> I have 2 tables:
>>
>> CREATE TABLE users (
>> a bigint,
>> b int
>> )
>>
>> CREATE TABLE products (
>> a bigint,
>> c int
>> )
>>
>> Each table has about 8 billion records (roughly 2k files total mappers).
>> I want to know the most performant way to do the following query:
>>
>> SELECT u.b,
>>               p.c,
>>               count(*) as count
>> FROM users u
>> INNER JOIN products p
>> ON u.a = p.a
>> GROUP BY u.b, p.c
>>
>> Right now the reducing is killing me. Any suggestions on improving
>> performance? Would a mapbucket join be optimal here?
>>
>> Thanks,
>> Brad
>>
>
>
>
> --
> Nitin Pawar
>

Re: Best Performance on Large Scale Join

Posted by Nitin Pawar <ni...@gmail.com>.
Brad,
whats the cluster capacity you have got?
how many uniq values of a,b  and c  you have got individually in any of the
one table?


Is there any chance you can partition data? are there any columns you have
on which you can create buckets?

I have done joins having 10 billion records in one table but other table
was significantly smaller. and I had a 1000 node cluster ad disposal





On Mon, Jul 29, 2013 at 11:08 PM, Brad Ruderman <br...@radiumone.com>wrote:

> Hi All-
>
> I have 2 tables:
>
> CREATE TABLE users (
> a bigint,
> b int
> )
>
> CREATE TABLE products (
> a bigint,
> c int
> )
>
> Each table has about 8 billion records (roughly 2k files total mappers). I
> want to know the most performant way to do the following query:
>
> SELECT u.b,
>               p.c,
>               count(*) as count
> FROM users u
> INNER JOIN products p
> ON u.a = p.a
> GROUP BY u.b, p.c
>
> Right now the reducing is killing me. Any suggestions on improving
> performance? Would a mapbucket join be optimal here?
>
> Thanks,
> Brad
>



-- 
Nitin Pawar

Re: Best Performance on Large Scale Join

Posted by Michael Malak <mi...@yahoo.com>.
Perhaps you can first create a temp table that contains only the records that will match?  See the UNION ALL trick at
http://www.mail-archive.com/hive-user@hadoop.apache.org/msg01906.html



________________________________
 From: Brad Ruderman <br...@radiumone.com>
To: user@hive.apache.org 
Sent: Monday, July 29, 2013 11:38 AM
Subject: Best Performance on Large Scale Join
 


Hi All-

I have 2 tables:

CREATE TABLE users (
a bigint,
b int
)

CREATE TABLE products (
a bigint,
c int
)

Each table has about 8 billion records (roughly 2k files total mappers). I want to know the most performant way to do the following query:

SELECT u.b,
              p.c,
              count(*) as count
FROM users u
INNER JOIN products p
ON u.a = p.a
GROUP BY u.b, p.c

Right now the reducing is killing me. Any suggestions on improving performance? Would a mapbucket join be optimal here?

Thanks,
Brad