@@ -201,23 +201,37 @@ private void getColumnDataColPathSpecified(Table table, Partition part, List<Fie
201201 }
202202 table .setParameters (tableProps );
203203 } else {
204- cols .addAll (getFilteredFieldsFromDeserializer (table , deserializer , colName ));
205- colStats .addAll (context .getDb ().getTableColumnStatistics (table , colNames , false ));
204+ addColsResolvedFromDeserializer (table , deserializer , colName , cols );
205+ if (desc .isFormatted ()) {
206+ colStats .addAll (context .getDb ().getTableColumnStatistics (table , colNames , false ));
207+ }
206208 }
207209 } else {
208210 List <String > partitions = new ArrayList <>();
209211 String partName = part .getName ();
210212 partitions .add (partName );
211- cols .addAll (getFilteredFieldsFromDeserializer (table , deserializer , colName ));
212- Map <String , List <ColumnStatisticsObj >> partitionColumnStatistics = context .getDb ().getPartitionColumnStatistics (
213- table .getDbName (), table .getTableName (), partitions , colNames , false );
214- List <ColumnStatisticsObj > partitionColStat = partitionColumnStatistics .get (partName );
215- if (partitionColStat != null ) {
216- colStats .addAll (partitionColStat );
213+ addColsResolvedFromDeserializer (table , deserializer , colName , cols );
214+ if (desc .isFormatted ()) {
215+ Map <String , List <ColumnStatisticsObj >> partitionColumnStatistics = context .getDb ()
216+ .getPartitionColumnStatistics (table .getDbName (), table .getTableName (), partitions ,
217+ colNames , false );
218+ List <ColumnStatisticsObj > partitionColStat = partitionColumnStatistics .get (partName );
219+ if (partitionColStat != null ) {
220+ colStats .addAll (partitionColStat );
221+ }
217222 }
218223 }
219224 }
220225
226+ private void addColsResolvedFromDeserializer (Table table , Deserializer deserializer , String firstColName ,
227+ List <FieldSchema > cols ) throws HiveException {
228+ if (desc .getColumnPath ().split ("\\ ." ).length > 3 || firstColName .startsWith ("$" )) {
229+ cols .addAll (Hive .getFieldsFromDeserializer (desc .getColumnPath (), deserializer , context .getConf ()));
230+ } else {
231+ cols .addAll (getFilteredFieldsFromDeserializer (table , deserializer , firstColName ));
232+ }
233+ }
234+
221235 private List <FieldSchema > getFilteredFieldsFromDeserializer (Table table , Deserializer deserializer ,
222236 String targetColName ) throws HiveException {
223237 List <FieldSchema > allFields = Hive .getFieldsFromDeserializer (table .getTableName (), deserializer , context .getConf ());
@@ -257,7 +271,7 @@ private void getColumnDataForPartitionKeyColumn(Table table, List<FieldSchema> c
257271 private void getColumnsForNotPartitionKeyColumn (Table table , List <FieldSchema > cols , List <ColumnStatisticsObj > colStats ,
258272 Deserializer deserializer , String colName , Map <String , String > tableProps )
259273 throws HiveException {
260- cols . addAll ( getFilteredFieldsFromDeserializer ( table , deserializer , colName ) );
274+ addColsResolvedFromDeserializer ( table , deserializer , colName , cols );
261275 if (desc .isFormatted ()) {
262276 List <String > parts = context .getDb ().getPartitionNames (table , (short ) -1 );
263277 AggrStats aggrStats = context .getDb ().getAggrColStatsFor (table , Lists .newArrayList (colName .toLowerCase ()),
0 commit comments