Hi Den, I think that is a valid solution. If you are using a version of hive > 0.12, you can also select columns from hbase using prefixes (introduced in [1]). Marginally more efficient than the "select all columns" approach and little more flexible as now just all columns sharing the given prefix need to have the same type.
[1] https://issues.apache.org/jira/browse/HIVE-3725 On Wed, Feb 19, 2014 at 5:22 PM, Den <dennis.lipov...@gmail.com> wrote: > I've arrived at a workaround that I'm using for this for now. Basically I > have a map in the Hive table corresponding to the column family then I'm > able to select from it. The downside here is that every qualifier has to > have the same data type and storage type, which I suppose you could work > around by having two map columns pointing to the same HBase column family > with different value types and storage types. Here's the basic idea of it: > > CREATE EXTERNAL TABLE t ( > id string, > cf map<string, string> > ) WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:") > > then it can be queried as: > > select cf['q1:q2'] from t > > > On Mon, Feb 17, 2014 at 6:16 PM, Den <dennis.lipov...@gmail.com> wrote: > >> I assume by 'escape' you mean something like: >> >> "hbase.columns.mapping" = ":key,cf:q1\:q2" >> >> That gave the same error as before. If that's not what you mean could you >> expand? >> >> I also tried to see if I could trick it by doing some binary encoding of >> the character >> >> "hbase.columns.mapping" = ":key,cf:q1\x3Aq2" >> >> where \x3A is the ascii hex code for ':'. That also didn't work either, >> the 'create external table' went through but all the values were NULL. >> >> I dug around a bit in the source and found that in HBaseSerDe.java in >> the parseColumnsMapping(...) function there is the following: >> >> int idxFirst = colInfo.indexOf(":"); >> int idxLast = colInfo.lastIndexOf(":"); >> >> if (idxFirst < 0 || !(idxFirst == idxLast)) { >> throw new SerDeException("Error: the HBase columns mapping contains >> a badly formed " + >> "column family, column qualifier specification."); >> } >> >> It seems that this will throw this error if there is not exactly 1 colon in >> the HBase column to map. So short of tricking it into thinking something >> else is a colon there might not be any way to map my columns without >> renaming them first. Thoughts? >> >> >> >> >> On Fri, Feb 14, 2014 at 10:50 AM, kulkarni.swar...@gmail.com < >> kulkarni.swar...@gmail.com> wrote: >> >>> Hi Den, >>> >>> Have you tried escaping the additional colon in the qualifier name? >>> >>> >>> On Fri, Feb 14, 2014 at 9:47 AM, Den <dennis.lipov...@gmail.com> wrote: >>> >>>> I'm working with an HBase database with a column of the form 'cf:q1:q2' >>>> where 'cf' is the column family 'q1:q2' is the column qualifier. When >>>> trying to map this in Hive I'm using a statement like the following: >>>> >>>> CREATE EXTERNAL TABLE t ( >>>> id string >>>> q1_q2 string >>>> ) WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:q1:q2") >>>> >>>> I get an error saying >>>> >>>> Error: the HBase columns mapping contains a badly formed column family, >>>> column qualifier specification. >>>> >>>> This seems to be due to the colon in the column qualifier. It seems to >>>> demand that there be exactly on colon in the field name and it has to be >>>> the one separating the column family from the column qualifier. >>>> >>>> Is there a reason that is the case? Is there any way around it so I can >>>> map the columns from the HBase DB to Hive? >>>> >>> >>> >>> >>> -- >>> Swarnim >>> >> >> > -- Swarnim