[ 
https://issues.apache.org/jira/browse/HIVE-11188?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Zheng Shao updated HIVE-11188:
------------------------------
    Description: 
Currently, ORCFile's String Dictionary uses StringRedBlackTree for 
adding/finding/sorting duplicate strings.  When there are a large number of 
unique strings (let's say over 16K) and a large number of rows (let's say 1M), 
the binary search will take O(1M * log(16K)) time which can be very long.

Alternatively, ORCFile's String Dictionary can use HashMap for adding/finding 
duplicate strings, and use quicksort at the end to produce a sorted order.  In 
the same case above, the total time spent will be O(1M + 16K * log(16K)) which 
is much faster.

When the number of unique string is close to the number of rows (let's say, 
both around 1M), ORC will automatically disable the dictionary encoding.  In 
the old approach will take O(1M * log(1M)), and our new approach will take 
O(1M) since we can skip the final quicksort if the dictionary encoding is 
disabled.

So in either case, the new approach should be a win.


Here is an PMP output based on ~600 traces (so 126 means 126/600 ~= 21% of 
total time). It's a query like "INSERT OVERWRITE TABLE SELECT * FROM src" using 
hive-1.1.0-cdh-5.4.1.

    126  
org.apache.hadoop.hive.ql.io.orc.StringRedBlackTree.compareValue(StringRedBlackTree.java:67)
     35  java.util.zip.Deflater.deflateBytes(Native Method)
     26  
org.apache.hadoop.hive.ql.io.orc.SerializationUtils.findClosestNumBits(SerializationUtils.java:218)
     24  
org.apache.hadoop.hive.serde2.lazy.LazyNonPrimitive.isNull(LazyNonPrimitive.java:63)
     22  org.apache.hadoop.hive.serde2.lazy.LazyMap.parse(LazyMap.java:204)
     22  
org.apache.hadoop.hive.serde2.lazy.LazyLong.parseLong(LazyLong.java:116)
     21  
org.apache.hadoop.hive.serde2.columnar.ColumnarStructBase$FieldInfo.uncheckedGetField(ColumnarStructBase.java:111)
     19  
org.apache.hadoop.hive.serde2.lazy.LazyPrimitive.hashCode(LazyPrimitive.java:57)
     18  
org.apache.hadoop.hive.ql.io.orc.RedBlackTree.getRight(RedBlackTree.java:99)
     16  
org.apache.hadoop.hive.ql.io.RCFile$Reader.getCurrentRow(RCFile.java:1932)
     15  
org.apache.hadoop.io.compress.zlib.ZlibDecompressor.inflateBytesDirect(Native 
Method)
     15  
org.apache.hadoop.hive.ql.io.orc.WriterImpl$IntegerTreeWriter.write(WriterImpl.java:929)
     12  
org.apache.hadoop.hive.ql.io.orc.WriterImpl$StructTreeWriter.write(WriterImpl.java:1607)
     12  org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:815)
     11  
org.apache.hadoop.hive.ql.io.orc.RedBlackTree.getLeft(RedBlackTree.java:92)
     11  
org.apache.hadoop.hive.ql.io.orc.DynamicIntArray.add(DynamicIntArray.java:105)
     10  org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:52)
     ...

> Make ORCFile's String Dictionary more efficient
> -----------------------------------------------
>
>                 Key: HIVE-11188
>                 URL: https://issues.apache.org/jira/browse/HIVE-11188
>             Project: Hive
>          Issue Type: Improvement
>          Components: File Formats
>    Affects Versions: 1.2.0, 1.1.0
>            Reporter: Zheng Shao
>            Priority: Minor
>
> Currently, ORCFile's String Dictionary uses StringRedBlackTree for 
> adding/finding/sorting duplicate strings.  When there are a large number of 
> unique strings (let's say over 16K) and a large number of rows (let's say 
> 1M), the binary search will take O(1M * log(16K)) time which can be very long.
> Alternatively, ORCFile's String Dictionary can use HashMap for adding/finding 
> duplicate strings, and use quicksort at the end to produce a sorted order.  
> In the same case above, the total time spent will be O(1M + 16K * log(16K)) 
> which is much faster.
> When the number of unique string is close to the number of rows (let's say, 
> both around 1M), ORC will automatically disable the dictionary encoding.  In 
> the old approach will take O(1M * log(1M)), and our new approach will take 
> O(1M) since we can skip the final quicksort if the dictionary encoding is 
> disabled.
> So in either case, the new approach should be a win.
> Here is an PMP output based on ~600 traces (so 126 means 126/600 ~= 21% of 
> total time). It's a query like "INSERT OVERWRITE TABLE SELECT * FROM src" 
> using hive-1.1.0-cdh-5.4.1.
>     126  
> org.apache.hadoop.hive.ql.io.orc.StringRedBlackTree.compareValue(StringRedBlackTree.java:67)
>      35  java.util.zip.Deflater.deflateBytes(Native Method)
>      26  
> org.apache.hadoop.hive.ql.io.orc.SerializationUtils.findClosestNumBits(SerializationUtils.java:218)
>      24  
> org.apache.hadoop.hive.serde2.lazy.LazyNonPrimitive.isNull(LazyNonPrimitive.java:63)
>      22  org.apache.hadoop.hive.serde2.lazy.LazyMap.parse(LazyMap.java:204)
>      22  
> org.apache.hadoop.hive.serde2.lazy.LazyLong.parseLong(LazyLong.java:116)
>      21  
> org.apache.hadoop.hive.serde2.columnar.ColumnarStructBase$FieldInfo.uncheckedGetField(ColumnarStructBase.java:111)
>      19  
> org.apache.hadoop.hive.serde2.lazy.LazyPrimitive.hashCode(LazyPrimitive.java:57)
>      18  
> org.apache.hadoop.hive.ql.io.orc.RedBlackTree.getRight(RedBlackTree.java:99)
>      16  
> org.apache.hadoop.hive.ql.io.RCFile$Reader.getCurrentRow(RCFile.java:1932)
>      15  
> org.apache.hadoop.io.compress.zlib.ZlibDecompressor.inflateBytesDirect(Native 
> Method)
>      15  
> org.apache.hadoop.hive.ql.io.orc.WriterImpl$IntegerTreeWriter.write(WriterImpl.java:929)
>      12  
> org.apache.hadoop.hive.ql.io.orc.WriterImpl$StructTreeWriter.write(WriterImpl.java:1607)
>      12  org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:815)
>      11  
> org.apache.hadoop.hive.ql.io.orc.RedBlackTree.getLeft(RedBlackTree.java:92)
>      11  
> org.apache.hadoop.hive.ql.io.orc.DynamicIntArray.add(DynamicIntArray.java:105)
>      10  org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:52)
>      ...



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to