You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@spark.apache.org by "Apache Spark (JIRA)" <ji...@apache.org> on 2018/06/23 12:23:00 UTC
[jira] [Assigned] (SPARK-24633) arrays_zip function's code
generator splits input processing incorrectly
[ https://issues.apache.org/jira/browse/SPARK-24633?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Apache Spark reassigned SPARK-24633:
------------------------------------
Assignee: Apache Spark
> arrays_zip function's code generator splits input processing incorrectly
> ------------------------------------------------------------------------
>
> Key: SPARK-24633
> URL: https://issues.apache.org/jira/browse/SPARK-24633
> Project: Spark
> Issue Type: Bug
> Components: SQL
> Affects Versions: 2.4.0
> Environment: Mac OS High Sierra
> Reporter: Bruce Robbins
> Assignee: Apache Spark
> Priority: Minor
>
> This works:
> {noformat}
> scala> val df = spark.read.parquet("many_arrays_per_row")
> df: org.apache.spark.sql.DataFrame = [k0: array<bigint>, k1: array<bigint> ... 98 more fields]
> scala> df.selectExpr("arrays_zip(k0, k1, k2)").show(truncate=false)
> +----------------------------------------+
> |arrays_zip(k0, k1, k2) |
> +----------------------------------------+
> |[[6583, 1312, 7460], [668, 1626, 4129]] |
> |[[5415, 5251, 1514], [1631, 2224, 2553]]|
> +----------------------------------------+
> {noformat}
> If I add one more array to the parameter list, I get this:
> {noformat}
> scala> df.selectExpr("arrays_zip(k0, k1, k2, k3)").show(truncate=false)
> 18/06/22 18:06:41 ERROR CodeGenerator: failed to compile: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 92, Column 35: Unknown variable or type "scan_row_0"
> org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 92, Column 35: Unknown variable or type "scan_row_0"
> at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:11821)
> at org.codehaus.janino.UnitCompiler.getType2(UnitCompiler.java:6521)
> at org.codehaus.janino.UnitCompiler.access$13100(UnitCompiler.java:212)
> at org.codehaus.janino.UnitCompiler$18.visitPackage(UnitCompiler.java:6133)
> .. much exception trace...
> 18/06/22 18:06:41 WARN WholeStageCodegenExec: Whole-stage codegen disabled for plan (id=1):
> *(1) LocalLimit 21
> +- *(1) Project [cast(arrays_zip(k0#375, k1#376, k2#387, k3#398) as string) AS arrays_zip(k0, k1, k2, k3)#619]
> +- *(1) FileScan parquet [k0#375,k1#376,k2#387,k3#398] Batched: false, Format: Parquet, Location: InMemoryFileIndex[file:/Users/brobbins/github/spark_upstream/many_arrays_per_row], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<k0:array<bigint>,k1:array<bigint>,k2:array<bigint>,k3:array<bigint>>
> +----------------------------------------------------+
> |arrays_zip(k0, k1, k2, k3) |
> +----------------------------------------------------+
> |[[6583, 1312, 7460, 3712], [668, 1626, 4129, 2815]] |
> |[[5415, 5251, 1514, 1580], [1631, 2224, 2553, 7555]]|
> +----------------------------------------------------+
> {noformat}
> I still got the answer!
> I add a 5th parameter:
> {noformat}
> scala> df.selectExpr("arrays_zip(k0, k1, k2, k3, k4)").show(truncate=false)
> 18/06/22 18:07:53 ERROR CodeGenerator: failed to compile: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 97, Column 35: Unknown variable or type "scan_row_0"
> org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 97, Column 35: Unknown variable or type "scan_row_0"
> at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:11821)
> at org.codehaus.janino.UnitCompiler.getType2(UnitCompiler.java:6521)
> at org.codehaus.janino.UnitCompiler.access$13100(UnitCompiler.java:212)
> at org.codehaus.janino.UnitCompiler$18.visitPackage(UnitCompiler.java:6133)
> at org.codehaus.janino.UnitCompiler$18.visitPackage(UnitCompiler.java:6130)
> at org.codehaus.janino.Java$Package.accept(Java.java:4077)
> .. much exception trace...
> Caused by: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 73, Column 21: failed to compile: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 73, Column 21: Unknown variable or type "i"
> at org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator$.org$apache$spark$sql$catalyst$expressions$codegen$CodeGenerator$$doCompile(CodeGenerator.scal\
> a:1361)
> at org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator$$anon$1.load(CodeGenerator.scala:1423)
> at org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator$$anon$1.load(CodeGenerator.scala:1420)
> at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3599)
> at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2379)
> ... 31 more
> scala>
> {noformat}
> This time, no result.
> It looks like the generated code is expecting the input row to be in a parameterĀ (either i or scan_row_x), but that parameter is not passedĀ to the input handler function (see lines 069 and 073)
> {noformat}
> /* 069 */ private int getValuesAndCardinalities_0_1(ArrayData[] arrVals_0, int biggestCardinality_0) {
> /* 070 */
> /* 071 */
> /* 072 */ if (biggestCardinality_0 != -1) {
> /* 073 */ boolean isNull_6 = i.isNullAt(4);
> /* 074 */ ArrayData value_6 = isNull_6 ?
> /* 075 */ null : (i.getArray(4));
> /* 076 */ if (!isNull_6) {
> /* 077 */ arrVals_0[4] = value_6;
> /* 078 */ biggestCardinality_0 = Math.max(biggestCardinality_0, value_6.numElements());
> /* 079 */ } else {
> /* 080 */ biggestCardinality_0 = -1;
> /* 081 */ }
> /* 082 */ }
> /* 083 */
> /* 084 */ return biggestCardinality_0;
> /* 085 */
> /* 086 */ }
> {noformat}
> Here's the scan_row_0 case:
> {noformat}
> /* 095 */ private int project_getValuesAndCardinalities_0_1(ArrayData[] project_arrVals_0, int project_biggestCardinality_0) {
> /* 096 */ if (project_biggestCardinality_0 != -1) {
> /* 097 */ boolean scan_isNull_3 = scan_row_0.isNullAt(3);
> /* 098 */ ArrayData scan_value_3 = scan_isNull_3 ?
> /* 099 */ null : (scan_row_0.getArray(3));
> /* 100 */ if (!scan_isNull_3) {
> /* 101 */ project_arrVals_0[3] = scan_value_3;
> /* 102 */ project_biggestCardinality_0 = Math.max(project_biggestCardinality_0, scan_value_3.numElements());
> /* 103 */ } else {
> /* 104 */ project_biggestCardinality_0 = -1;
> /* 105 */ }
> /* 106 */ }
> {noformat}
> I am marking this as minor since this function is new and not in a released version of Spark.
> cc [~DylanGuedes]
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)
---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@spark.apache.org
For additional commands, e-mail: issues-help@spark.apache.org