@Override public RowSet getNextRowSet(FetchOrientation orientation, long maxRows) throws HiveSQLException { validateDefaultFetchOrientation(orientation); assertState(OperationState.FINISHED); RowSet rowSet = RowSetFactory.create(resultSchema, getProtocolVersion()); try { /* if client is requesting fetch-from-start and its not the first time reading from this operation * then reset the fetch position to beginning */ if (orientation.equals(FetchOrientation.FETCH_FIRST) && fetchStarted) { driver.resetFetch(); } fetchStarted = true; driver.setMaxRows((int) maxRows); if (driver.getResults(convey)) { return decode(convey, rowSet); } return rowSet; } catch (IOException e) { throw new HiveSQLException(e); } catch (CommandNeedRetryException e) { throw new HiveSQLException(e); } catch (Exception e) { throw new HiveSQLException(e); } finally { convey.clear(); } }
/** * Fetches numRows rows. * * @param numRows Number of rows to fetch. * @return A list of rows. The size of the list is numRows if there are at least numRows rows * available to return. The size is smaller than numRows if there aren't enough rows. The * list will be empty if there is no more row to fetch or numRows == 0. * @throws HiveServerException Invalid value for numRows (numRows < 0) */ public List<String> fetchN(int numRows) throws HiveServerException, TException { if (numRows < 0) { throw new HiveServerException("Invalid argument for number of rows: " + numRows); } if (!isHiveQuery) // Return no results if the last command was not a Hive query return new Vector<String>(); Vector<String> result = new Vector<String>(); driver.setMaxRows(numRows); try { driver.getResults(result); } catch (IOException e) { throw new HiveServerException(e.getMessage()); } return result; }
/** * Fetches the next row in a query result set. * * @return the next row in a query result set. null if there is no more row to fetch. */ public String fetchOne() throws HiveServerException, TException { if (!isHiveQuery) // Return no results if the last command was not a Hive query return ""; Vector<String> result = new Vector<String>(); driver.setMaxRows(1); try { if (driver.getResults(result)) { return result.get(0); } // TODO: Cannot return null here because thrift cannot handle nulls // TODO: Returning empty string for now. Need to figure out how to // TODO: return null in some other way return ""; } catch (IOException e) { throw new HiveServerException(e.getMessage()); } }
@Override public RowSet getNextRowSet(FetchOrientation orientation, long maxRows) throws HiveSQLException { assertState(OperationState.FINISHED); ArrayList<String> rows = new ArrayList<String>(); driver.setMaxRows((int) maxRows); try { driver.getResults(rows); getSerDe(); StructObjectInspector soi = (StructObjectInspector) serde.getObjectInspector(); List<? extends StructField> fieldRefs = soi.getAllStructFieldRefs(); RowSet rowSet = new RowSet(); Object[] deserializedFields = new Object[fieldRefs.size()]; Object rowObj; ObjectInspector fieldOI; for (String rowString : rows) { rowObj = serde.deserialize(new BytesWritable(rowString.getBytes())); for (int i = 0; i < fieldRefs.size(); i++) { StructField fieldRef = fieldRefs.get(i); fieldOI = fieldRef.getFieldObjectInspector(); deserializedFields[i] = convertLazyToJava(soi.getStructFieldData(rowObj, fieldRef), fieldOI); } rowSet.addRow(resultSchema, deserializedFields); } return rowSet; } catch (IOException e) { throw new HiveSQLException(e); } catch (CommandNeedRetryException e) { throw new HiveSQLException(e); } catch (Exception e) { throw new HiveSQLException(e); } }