-
Notifications
You must be signed in to change notification settings - Fork 28.6k
[SPARK-22226][SQL] splitExpression can create too many method calls in the outer class #19480
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
c2cc295
d3a5b87
e63264b
bdc2fdb
b9ffc52
831fc40
76b5489
20626b4
5f39500
c4601b4
61cc445
37506dc
95b0ad8
bce3616
c4ab587
0215139
41c0b2b
6a1eeca
be84c4d
a39098d
6e8cd00
36d8e2e
4952880
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -201,6 +201,23 @@ class CodeGenerationSuite extends SparkFunSuite with ExpressionEvalHelper { | |
} | ||
} | ||
|
||
test("SPARK-22226: group splitted expressions into one method per nested class") { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Besides the unit test, can you provide an end-to-end case that can trigger this issue too? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I have a use case where I faced this problem. And I tried this patch on it. Unfortunately this contains a very complex business logic and I have not been able to reproduce it in a simple one. But if needed, I can try again. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Instead of copying your customer codes, can you making a fake one? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @mgaido91 I can reproduce the issue by following test case. You can check it: test("SPARK-22226: too much splitted expressions should not exceed constant pool limit") {
withSQLConf(
(SQLConf.WHOLESTAGE_CODEGEN_ENABLED.key, "false")) {
val colNumber = 1000
val baseDF = spark.range(10).toDF()
val newCols = (1 to colNumber).map { colIndex =>
expr(s"id + $colIndex").as(s"_$colIndex")
}
val input = baseDF.select(newCols: _*)
val aggs = (1 to colNumber).flatMap { colIndex =>
val colName = s"_$colIndex"
Seq(expr(s"stddev($colName)"),
expr(s"stddev_samp($colName)"),
expr(s"stddev_pop($colName)"),
expr(s"variance($colName)"),
expr(s"var_samp($colName)"),
expr(s"var_pop($colName)"),
expr(s"skewness($colName)"),
expr(s"kurtosis($colName)"))
}
input.agg(aggs.head, aggs.tail: _*).collect()
}
}
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thank you very much for your help @viirya ! In my use cases it seemed to be connected to the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I was adding it to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @viirya I have a good and a bad news... Thanks to your suggestion I have been able to understand and reproduce the issue. Moreover, I found also another issue which is fixed by this problem and I am adding a UT for that too: in some cases, we might have a
And with this PR the problem is fixed. The bad thing is that the UT you provided still fails, but with a different error: actually it is always a Constant Pool limit exceeded exception, but it is in a NestedClass. From my analysis, this is caused by another problem, ie. that we might reference too many fields of the superclass in the NestedClasses. This might be addressed maybe trying to tune the magic number which I brought to 1000k in this PR, but I am pretty sure that it will be also addressed by the ongoing PR for SPARK-18016, since he is trying to reduce the number of variables. Thus I consider this out of scope for this PR. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @mgaido91 Do you meant "2: compact primitive declarations into arrays" in SPARK-18016? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @mgaido91 Thanks for trying it. Yeah, those expressions like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @viirya exactly, I meant that. Thank you for your suggestion. You have been very helpful to me. |
||
val length = 10000 | ||
val expressions = Seq.fill(length) { | ||
ToUTCTimestamp( | ||
Literal.create(Timestamp.valueOf("2017-10-10 00:00:00"), TimestampType), | ||
Literal.create("PST", StringType)) | ||
} | ||
val plan = GenerateMutableProjection.generate(expressions) | ||
val actual = plan(new GenericInternalRow(length)).toSeq(expressions.map(_.dataType)) | ||
val expected = Seq.fill(length)( | ||
DateTimeUtils.fromJavaTimestamp(Timestamp.valueOf("2017-10-10 07:00:00"))) | ||
|
||
if (actual != expected) { | ||
fail(s"Incorrect Evaluation: expressions: $expressions, actual: $actual, expected: $expected") | ||
} | ||
} | ||
|
||
test("test generated safe and unsafe projection") { | ||
val schema = new StructType(Array( | ||
StructField("a", StringType, true), | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.