Skip to content

Commit 89e05a8

Browse files
committed
[SPARK-51326][CONNECT] Remove LazyExpression proto message
### What changes were proposed in this pull request? Removes `LazyExpression` proto message. As any feature using this proto message is not released yet, it's safe to remove it from master and branch-4.0. ### Why are the changes needed? Discussed offline and found out that Spark Connect should work without it. ### Does this PR introduce _any_ user-facing change? No. ### How was this patch tested? The existing tests should pass. ### Was this patch authored or co-authored using generative AI tooling? No. Closes apache#50093 from ueshin/issues/SPARK-51326/lazy_expression. Authored-by: Takuya Ueshin <[email protected]> Signed-off-by: Takuya Ueshin <[email protected]>
1 parent a3671e5 commit 89e05a8

File tree

7 files changed

+86
-148
lines changed

7 files changed

+86
-148
lines changed

python/pyspark/sql/connect/column.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
Expression,
4545
UnresolvedFunction,
4646
UnresolvedExtractValue,
47-
LazyExpression,
4847
LiteralExpression,
4948
CaseWhen,
5049
SortOrder,
@@ -459,7 +458,7 @@ def over(self, window: "WindowSpec") -> ParentColumn: # type: ignore[override]
459458
return Column(WindowExpression(windowFunction=self._expr, windowSpec=window))
460459

461460
def outer(self) -> ParentColumn:
462-
return Column(LazyExpression(self._expr))
461+
return Column(self._expr)
463462

464463
def isin(self, *cols: Any) -> ParentColumn:
465464
if len(cols) == 1 and isinstance(cols[0], (list, set)):

python/pyspark/sql/connect/expressions.py

-19
Original file line numberDiff line numberDiff line change
@@ -1233,25 +1233,6 @@ def __repr__(self) -> str:
12331233
return f"{self._key} => {self._value}"
12341234

12351235

1236-
class LazyExpression(Expression):
1237-
def __init__(self, expr: Expression):
1238-
assert isinstance(expr, Expression)
1239-
super().__init__()
1240-
self._expr = expr
1241-
1242-
def to_plan(self, session: "SparkConnectClient") -> proto.Expression:
1243-
expr = self._create_proto_expression()
1244-
expr.lazy_expression.child.CopyFrom(self._expr.to_plan(session))
1245-
return expr
1246-
1247-
@property
1248-
def children(self) -> Sequence["Expression"]:
1249-
return [self._expr]
1250-
1251-
def __repr__(self) -> str:
1252-
return f"lazy({self._expr})"
1253-
1254-
12551236
class SubqueryExpression(Expression):
12561237
def __init__(
12571238
self,

python/pyspark/sql/connect/proto/expressions_pb2.py

+82-84
Large diffs are not rendered by default.

python/pyspark/sql/connect/proto/expressions_pb2.pyi

-28
Original file line numberDiff line numberDiff line change
@@ -1289,7 +1289,6 @@ class Expression(google.protobuf.message.Message):
12891289
NAMED_ARGUMENT_EXPRESSION_FIELD_NUMBER: builtins.int
12901290
MERGE_ACTION_FIELD_NUMBER: builtins.int
12911291
TYPED_AGGREGATE_EXPRESSION_FIELD_NUMBER: builtins.int
1292-
LAZY_EXPRESSION_FIELD_NUMBER: builtins.int
12931292
SUBQUERY_EXPRESSION_FIELD_NUMBER: builtins.int
12941293
EXTENSION_FIELD_NUMBER: builtins.int
12951294
@property
@@ -1335,8 +1334,6 @@ class Expression(google.protobuf.message.Message):
13351334
@property
13361335
def typed_aggregate_expression(self) -> global___TypedAggregateExpression: ...
13371336
@property
1338-
def lazy_expression(self) -> global___LazyExpression: ...
1339-
@property
13401337
def subquery_expression(self) -> global___SubqueryExpression: ...
13411338
@property
13421339
def extension(self) -> google.protobuf.any_pb2.Any:
@@ -1367,7 +1364,6 @@ class Expression(google.protobuf.message.Message):
13671364
named_argument_expression: global___NamedArgumentExpression | None = ...,
13681365
merge_action: global___MergeAction | None = ...,
13691366
typed_aggregate_expression: global___TypedAggregateExpression | None = ...,
1370-
lazy_expression: global___LazyExpression | None = ...,
13711367
subquery_expression: global___SubqueryExpression | None = ...,
13721368
extension: google.protobuf.any_pb2.Any | None = ...,
13731369
) -> None: ...
@@ -1392,8 +1388,6 @@ class Expression(google.protobuf.message.Message):
13921388
b"extension",
13931389
"lambda_function",
13941390
b"lambda_function",
1395-
"lazy_expression",
1396-
b"lazy_expression",
13971391
"literal",
13981392
b"literal",
13991393
"merge_action",
@@ -1445,8 +1439,6 @@ class Expression(google.protobuf.message.Message):
14451439
b"extension",
14461440
"lambda_function",
14471441
b"lambda_function",
1448-
"lazy_expression",
1449-
b"lazy_expression",
14501442
"literal",
14511443
b"literal",
14521444
"merge_action",
@@ -1500,7 +1492,6 @@ class Expression(google.protobuf.message.Message):
15001492
"named_argument_expression",
15011493
"merge_action",
15021494
"typed_aggregate_expression",
1503-
"lazy_expression",
15041495
"subquery_expression",
15051496
"extension",
15061497
]
@@ -1931,25 +1922,6 @@ class MergeAction(google.protobuf.message.Message):
19311922

19321923
global___MergeAction = MergeAction
19331924

1934-
class LazyExpression(google.protobuf.message.Message):
1935-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
1936-
1937-
CHILD_FIELD_NUMBER: builtins.int
1938-
@property
1939-
def child(self) -> global___Expression:
1940-
"""(Required) The expression to be marked as lazy."""
1941-
def __init__(
1942-
self,
1943-
*,
1944-
child: global___Expression | None = ...,
1945-
) -> None: ...
1946-
def HasField(
1947-
self, field_name: typing_extensions.Literal["child", b"child"]
1948-
) -> builtins.bool: ...
1949-
def ClearField(self, field_name: typing_extensions.Literal["child", b"child"]) -> None: ...
1950-
1951-
global___LazyExpression = LazyExpression
1952-
19531925
class SubqueryExpression(google.protobuf.message.Message):
19541926
DESCRIPTOR: google.protobuf.descriptor.Descriptor
19551927

sql/connect/common/src/main/protobuf/spark/connect/expressions.proto

+1-7
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@ message Expression {
5252
NamedArgumentExpression named_argument_expression = 17;
5353
MergeAction merge_action = 19;
5454
TypedAggregateExpression typed_aggregate_expression = 20;
55-
LazyExpression lazy_expression = 21;
56-
SubqueryExpression subquery_expression = 22;
55+
SubqueryExpression subquery_expression = 21;
5756

5857
// This field is used to mark extensions to the protocol. When plugins generate arbitrary
5958
// relations they can add them here. During the planning the correct resolution is done.
@@ -474,11 +473,6 @@ message MergeAction {
474473
}
475474
}
476475

477-
message LazyExpression {
478-
// (Required) The expression to be marked as lazy.
479-
Expression child = 1;
480-
}
481-
482476
message SubqueryExpression {
483477
// (Required) The ID of the corresponding connect plan.
484478
int64 plan_id = 1;

sql/connect/common/src/main/scala/org/apache/spark/sql/connect/columnNodeSupport.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ object ColumnNodeToProtoConverter extends (ColumnNode => proto.Expression) {
216216
}
217217

218218
case LazyExpression(child, _) =>
219-
builder.getLazyExpressionBuilder.setChild(apply(child, e))
219+
return apply(child, e)
220220

221221
case SubqueryExpressionNode(relation, subqueryType, _) =>
222222
val b = builder.getSubqueryExpressionBuilder

sql/connect/server/src/main/scala/org/apache/spark/sql/connect/planner/SparkConnectPlanner.scala

+1-7
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import org.apache.spark.internal.LogKeys.{DATAFRAME_ID, SESSION_ID}
4646
import org.apache.spark.resource.{ExecutorResourceRequest, ResourceProfile, TaskResourceProfile, TaskResourceRequest}
4747
import org.apache.spark.sql.{Column, Encoders, ForeachWriter, Observation, Row}
4848
import org.apache.spark.sql.catalyst.{expressions, AliasIdentifier, FunctionIdentifier, QueryPlanningTracker}
49-
import org.apache.spark.sql.catalyst.analysis.{FunctionRegistry, GlobalTempView, LazyExpression, LocalTempView, MultiAlias, NameParameterizedQuery, PosParameterizedQuery, UnresolvedAlias, UnresolvedAttribute, UnresolvedDataFrameStar, UnresolvedDeserializer, UnresolvedExtractValue, UnresolvedFunction, UnresolvedPlanId, UnresolvedRegex, UnresolvedRelation, UnresolvedStar, UnresolvedStarWithColumns, UnresolvedStarWithColumnsRenames, UnresolvedSubqueryColumnAliases, UnresolvedTableValuedFunction, UnresolvedTranspose}
49+
import org.apache.spark.sql.catalyst.analysis.{FunctionRegistry, GlobalTempView, LocalTempView, MultiAlias, NameParameterizedQuery, PosParameterizedQuery, UnresolvedAlias, UnresolvedAttribute, UnresolvedDataFrameStar, UnresolvedDeserializer, UnresolvedExtractValue, UnresolvedFunction, UnresolvedPlanId, UnresolvedRegex, UnresolvedRelation, UnresolvedStar, UnresolvedStarWithColumns, UnresolvedStarWithColumnsRenames, UnresolvedSubqueryColumnAliases, UnresolvedTableValuedFunction, UnresolvedTranspose}
5050
import org.apache.spark.sql.catalyst.encoders.{encoderFor, AgnosticEncoder, ExpressionEncoder, RowEncoder}
5151
import org.apache.spark.sql.catalyst.encoders.AgnosticEncoders.{ProductEncoder, RowEncoder => AgnosticRowEncoder, StringEncoder, UnboundRowEncoder}
5252
import org.apache.spark.sql.catalyst.expressions._
@@ -1694,8 +1694,6 @@ class SparkConnectPlanner(
16941694
transformMergeAction(exp.getMergeAction)
16951695
case proto.Expression.ExprTypeCase.TYPED_AGGREGATE_EXPRESSION =>
16961696
transformTypedAggregateExpression(exp.getTypedAggregateExpression, baseRelationOpt)
1697-
case proto.Expression.ExprTypeCase.LAZY_EXPRESSION =>
1698-
transformLazyExpression(exp.getLazyExpression)
16991697
case proto.Expression.ExprTypeCase.SUBQUERY_EXPRESSION =>
17001698
transformSubqueryExpression(exp.getSubqueryExpression)
17011699
case _ =>
@@ -3939,10 +3937,6 @@ class SparkConnectPlanner(
39393937
}
39403938
}
39413939

3942-
private def transformLazyExpression(getLazyExpression: proto.LazyExpression): Expression = {
3943-
LazyExpression(transformExpression(getLazyExpression.getChild))
3944-
}
3945-
39463940
private def transformSubqueryExpression(
39473941
getSubqueryExpression: proto.SubqueryExpression): Expression = {
39483942
val planId = getSubqueryExpression.getPlanId

0 commit comments

Comments
 (0)