You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@phoenix.apache.org by anil gupta <an...@gmail.com> on 2016/01/06 01:14:27 UTC

Phoenix MR integration api only accepts Index of column for setting column value

Hi,

I am using Phoenix4.4. I am trying to integrate my MapReduce job with
Phoenix following this doc: https://phoenix.apache.org/phoenix_mr.html


My phoenix table has around 1000 columns. I have some hesitation regarding
using *COLUMN_INDEX* for setting its value rather than *NAME* as per
following example:

@Override
    public void write(PreparedStatement pstmt) throws SQLException {
       pstmt.setString(1, stockName);
       pstmt.setDouble(2, maxPrice);
    }

There are couple of problems with above:
1. What if someone deletes a column from table? My guess, It will change
index of some of the columns. Right?(Lets say, a table has 5 columns. 3rd
column of table is deleted.)
2. Readability of code is also less since column names are denoted by
numbers.(in reality it's a name/value pair)

Instead, if we have following API then it will be much easier and above
problems will be fixed:

@Override
    public void write(PreparedStatement pstmt) throws SQLException {
       pstmt.setString("STOCK_NAME", stockName);
       pstmt.setDouble("MAX_RECORDING", maxPrice);
    }

Also, my coding habits are giving me hard time to code on basis of
index when in reality its a key/value pair. :)

Is there anyway i can achieve the above? Would the community like to
have the key/value api?


-- 
Thanks & Regards,
Anil Gupta

Re: Phoenix MR integration api only accepts Index of column for setting column value

Posted by anil gupta <an...@gmail.com>.
Yeah, i just read about Prepared statement of JDBC. 5 years of NoSql work
has made me a dummy when it comes RDBMS like SQL. :)

Thanks,
Anil

On Wed, Jan 6, 2016 at 9:58 PM, James Taylor <ja...@apache.org> wrote:

> My mistake - I was thinking of ResultSet.getString(String,String) and ResultSet.getString(int,String). PreparedStatement
> sets parameters based on the order you list the ? In your statement - they
> don't necessarily map to columns at all. These are all standard JDBC
> interfaces, not defined by Phoenix at all. FWIW, there are a lot of good
> online resources to learn about them.
>
> Thanks,
> James
>
> On Wednesday, January 6, 2016, anil gupta <an...@gmail.com> wrote:
>
>> Hi James,
>>
>> Maybe, i am missing your point. I dont see following method in
>> PreparedStatement interface:
>>
>> pstmt.setString("STOCK_NAME", stockName);
>>
>> Do i need to use some other stuff than Phoenix MR integration to get that method?
>>
>> Thanks,
>>
>> Anil Gupta
>>
>>
>>
>> On Tue, Jan 5, 2016 at 8:48 PM, James Taylor <ja...@apache.org>
>> wrote:
>>
>>> With JDBC, both will already work.
>>>
>>> pstmt.setString("STOCK_NAME", stockName);
>>>
>>> pstmt.setString(1, stockName);
>>>
>>>
>>> On Tuesday, January 5, 2016, anil gupta <an...@gmail.com> wrote:
>>>
>>>> Hi,
>>>>
>>>> I am using Phoenix4.4. I am trying to integrate my MapReduce job with
>>>> Phoenix following this doc: https://phoenix.apache.org/phoenix_mr.html
>>>>
>>>>
>>>> My phoenix table has around 1000 columns. I have some hesitation
>>>> regarding using *COLUMN_INDEX* for setting its value rather than *NAME* as
>>>> per following example:
>>>>
>>>> @Override
>>>>     public void write(PreparedStatement pstmt) throws SQLException {
>>>>        pstmt.setString(1, stockName);
>>>>        pstmt.setDouble(2, maxPrice);
>>>>     }
>>>>
>>>> There are couple of problems with above:
>>>> 1. What if someone deletes a column from table? My guess, It will
>>>> change index of some of the columns. Right?(Lets say, a table has 5
>>>> columns. 3rd column of table is deleted.)
>>>> 2. Readability of code is also less since column names are denoted by
>>>> numbers.(in reality it's a name/value pair)
>>>>
>>>> Instead, if we have following API then it will be much easier and above
>>>> problems will be fixed:
>>>>
>>>> @Override
>>>>     public void write(PreparedStatement pstmt) throws SQLException {
>>>>        pstmt.setString("STOCK_NAME", stockName);
>>>>        pstmt.setDouble("MAX_RECORDING", maxPrice);
>>>>     }
>>>>
>>>> Also, my coding habits are giving me hard time to code on basis of index when in reality its a key/value pair. :)
>>>>
>>>> Is there anyway i can achieve the above? Would the community like to have the key/value api?
>>>>
>>>>
>>>> --
>>>> Thanks & Regards,
>>>> Anil Gupta
>>>>
>>>
>>
>>
>> --
>> Thanks & Regards,
>> Anil Gupta
>>
>


-- 
Thanks & Regards,
Anil Gupta

Re: Phoenix MR integration api only accepts Index of column for setting column value

Posted by James Taylor <ja...@apache.org>.
My mistake - I was thinking of ResultSet.getString(String,String) and
ResultSet.getString(int,String). PreparedStatement
sets parameters based on the order you list the ? In your statement - they
don't necessarily map to columns at all. These are all standard JDBC
interfaces, not defined by Phoenix at all. FWIW, there are a lot of good
online resources to learn about them.

Thanks,
James

On Wednesday, January 6, 2016, anil gupta <an...@gmail.com> wrote:

> Hi James,
>
> Maybe, i am missing your point. I dont see following method in
> PreparedStatement interface:
>
> pstmt.setString("STOCK_NAME", stockName);
>
> Do i need to use some other stuff than Phoenix MR integration to get that method?
>
> Thanks,
>
> Anil Gupta
>
>
>
> On Tue, Jan 5, 2016 at 8:48 PM, James Taylor <jamestaylor@apache.org
> <javascript:_e(%7B%7D,'cvml','jamestaylor@apache.org');>> wrote:
>
>> With JDBC, both will already work.
>>
>> pstmt.setString("STOCK_NAME", stockName);
>>
>> pstmt.setString(1, stockName);
>>
>>
>> On Tuesday, January 5, 2016, anil gupta <anilgupta84@gmail.com
>> <javascript:_e(%7B%7D,'cvml','anilgupta84@gmail.com');>> wrote:
>>
>>> Hi,
>>>
>>> I am using Phoenix4.4. I am trying to integrate my MapReduce job with
>>> Phoenix following this doc: https://phoenix.apache.org/phoenix_mr.html
>>>
>>>
>>> My phoenix table has around 1000 columns. I have some hesitation
>>> regarding using *COLUMN_INDEX* for setting its value rather than *NAME* as
>>> per following example:
>>>
>>> @Override
>>>     public void write(PreparedStatement pstmt) throws SQLException {
>>>        pstmt.setString(1, stockName);
>>>        pstmt.setDouble(2, maxPrice);
>>>     }
>>>
>>> There are couple of problems with above:
>>> 1. What if someone deletes a column from table? My guess, It will change
>>> index of some of the columns. Right?(Lets say, a table has 5 columns. 3rd
>>> column of table is deleted.)
>>> 2. Readability of code is also less since column names are denoted by
>>> numbers.(in reality it's a name/value pair)
>>>
>>> Instead, if we have following API then it will be much easier and above
>>> problems will be fixed:
>>>
>>> @Override
>>>     public void write(PreparedStatement pstmt) throws SQLException {
>>>        pstmt.setString("STOCK_NAME", stockName);
>>>        pstmt.setDouble("MAX_RECORDING", maxPrice);
>>>     }
>>>
>>> Also, my coding habits are giving me hard time to code on basis of index when in reality its a key/value pair. :)
>>>
>>> Is there anyway i can achieve the above? Would the community like to have the key/value api?
>>>
>>>
>>> --
>>> Thanks & Regards,
>>> Anil Gupta
>>>
>>
>
>
> --
> Thanks & Regards,
> Anil Gupta
>

Re: Phoenix MR integration api only accepts Index of column for setting column value

Posted by anil gupta <an...@gmail.com>.
Hi James,

Maybe, i am missing your point. I dont see following method in
PreparedStatement interface:

pstmt.setString("STOCK_NAME", stockName);

Do i need to use some other stuff than Phoenix MR integration to get
that method?

Thanks,

Anil Gupta



On Tue, Jan 5, 2016 at 8:48 PM, James Taylor <ja...@apache.org> wrote:

> With JDBC, both will already work.
>
> pstmt.setString("STOCK_NAME", stockName);
>
> pstmt.setString(1, stockName);
>
>
> On Tuesday, January 5, 2016, anil gupta <an...@gmail.com> wrote:
>
>> Hi,
>>
>> I am using Phoenix4.4. I am trying to integrate my MapReduce job with
>> Phoenix following this doc: https://phoenix.apache.org/phoenix_mr.html
>>
>>
>> My phoenix table has around 1000 columns. I have some hesitation
>> regarding using *COLUMN_INDEX* for setting its value rather than *NAME* as
>> per following example:
>>
>> @Override
>>     public void write(PreparedStatement pstmt) throws SQLException {
>>        pstmt.setString(1, stockName);
>>        pstmt.setDouble(2, maxPrice);
>>     }
>>
>> There are couple of problems with above:
>> 1. What if someone deletes a column from table? My guess, It will change
>> index of some of the columns. Right?(Lets say, a table has 5 columns. 3rd
>> column of table is deleted.)
>> 2. Readability of code is also less since column names are denoted by
>> numbers.(in reality it's a name/value pair)
>>
>> Instead, if we have following API then it will be much easier and above
>> problems will be fixed:
>>
>> @Override
>>     public void write(PreparedStatement pstmt) throws SQLException {
>>        pstmt.setString("STOCK_NAME", stockName);
>>        pstmt.setDouble("MAX_RECORDING", maxPrice);
>>     }
>>
>> Also, my coding habits are giving me hard time to code on basis of index when in reality its a key/value pair. :)
>>
>> Is there anyway i can achieve the above? Would the community like to have the key/value api?
>>
>>
>> --
>> Thanks & Regards,
>> Anil Gupta
>>
>


-- 
Thanks & Regards,
Anil Gupta

Re: Phoenix MR integration api only accepts Index of column for setting column value

Posted by James Taylor <ja...@apache.org>.
With JDBC, both will already work.

pstmt.setString("STOCK_NAME", stockName);

pstmt.setString(1, stockName);


On Tuesday, January 5, 2016, anil gupta <an...@gmail.com> wrote:

> Hi,
>
> I am using Phoenix4.4. I am trying to integrate my MapReduce job with
> Phoenix following this doc: https://phoenix.apache.org/phoenix_mr.html
>
>
> My phoenix table has around 1000 columns. I have some hesitation regarding
> using *COLUMN_INDEX* for setting its value rather than *NAME* as per
> following example:
>
> @Override
>     public void write(PreparedStatement pstmt) throws SQLException {
>        pstmt.setString(1, stockName);
>        pstmt.setDouble(2, maxPrice);
>     }
>
> There are couple of problems with above:
> 1. What if someone deletes a column from table? My guess, It will change
> index of some of the columns. Right?(Lets say, a table has 5 columns. 3rd
> column of table is deleted.)
> 2. Readability of code is also less since column names are denoted by
> numbers.(in reality it's a name/value pair)
>
> Instead, if we have following API then it will be much easier and above
> problems will be fixed:
>
> @Override
>     public void write(PreparedStatement pstmt) throws SQLException {
>        pstmt.setString("STOCK_NAME", stockName);
>        pstmt.setDouble("MAX_RECORDING", maxPrice);
>     }
>
> Also, my coding habits are giving me hard time to code on basis of index when in reality its a key/value pair. :)
>
> Is there anyway i can achieve the above? Would the community like to have the key/value api?
>
>
> --
> Thanks & Regards,
> Anil Gupta
>