/// <summary> /// Read one RDDCommand from the stream. /// </summary> /// <param name="stream">Stream to read from</param> /// <returns>RDDCommand object</returns> private static RDDCommand ReadRDDCommand(Stream stream) { int commandBytesCount = SerDe.ReadInt32(stream); if (commandBytesCount <= 0) { throw new InvalidDataException( $"Invalid command size: {commandBytesCount}"); } var rddCommand = new RDDCommand { WorkerFunction = new RDD.WorkerFunction( CommandSerDe.Deserialize <RDD.WorkerFunction.ExecuteDelegate>( stream, out CommandSerDe.SerializedMode serializerMode, out CommandSerDe.SerializedMode deserializerMode, out var runMode)) }; rddCommand.SerializerMode = serializerMode; rddCommand.DeserializerMode = deserializerMode; return(rddCommand); }
/// <summary> /// Read SqlCommands from the stream. /// </summary> /// <param name="stream">Stream to read from</param> /// <param name="evalType">Evaluation type for the current commands</param> /// <returns>SqlCommand objects</returns> private static SqlCommand[] ReadSqlCommands( PythonEvalType evalType, Stream stream) { int numUdfs = SerDe.ReadInt32(stream); var commands = new SqlCommand[numUdfs]; for (int i = 0; i < numUdfs; ++i) { var command = new SqlCommand(); int numArgsOffsets = SerDe.ReadInt32(stream); command.ArgOffsets = new int[numArgsOffsets]; for (int argIndex = 0; argIndex < numArgsOffsets; ++argIndex) { command.ArgOffsets[argIndex] = SerDe.ReadInt32(stream); } command.NumChainedFunctions = SerDe.ReadInt32(stream); for (int funcIndex = 0; funcIndex < command.NumChainedFunctions; ++funcIndex) { int commandBytesCount = SerDe.ReadInt32(stream); if (commandBytesCount > 0) { CommandSerDe.SerializedMode serializerMode; CommandSerDe.SerializedMode deserializerMode; if (evalType == PythonEvalType.SQL_SCALAR_PANDAS_UDF) { var curWorkerFunction = new ArrowWorkerFunction( CommandSerDe.Deserialize <ArrowWorkerFunction.ExecuteDelegate>( stream, out serializerMode, out deserializerMode, out string runMode)); command.WorkerFunction = (command.WorkerFunction == null) ? curWorkerFunction : ArrowWorkerFunction.Chain( (ArrowWorkerFunction)command.WorkerFunction, curWorkerFunction); } else if (evalType == PythonEvalType.SQL_GROUPED_MAP_PANDAS_UDF) { if ((numUdfs != 1) || (command.WorkerFunction != null)) { throw new InvalidDataException( "Grouped map UDFs do not support combining multiple UDFs"); } command.WorkerFunction = new ArrowGroupedMapWorkerFunction( CommandSerDe.Deserialize <ArrowGroupedMapWorkerFunction.ExecuteDelegate>( stream, out serializerMode, out deserializerMode, out string runMode)); } else { var curWorkerFunction = new PicklingWorkerFunction( CommandSerDe.Deserialize <PicklingWorkerFunction.ExecuteDelegate>( stream, out serializerMode, out deserializerMode, out string runMode)); command.WorkerFunction = (command.WorkerFunction == null) ? curWorkerFunction : PicklingWorkerFunction.Chain( (PicklingWorkerFunction)command.WorkerFunction, curWorkerFunction); } command.SerializerMode = serializerMode; command.DeserializerMode = deserializerMode; } else { throw new InvalidDataException( $"Invalid command size: {commandBytesCount}"); } } commands[i] = command; } return(commands); }