You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@spark.apache.org by "Sandeep Katta (Jira)" <ji...@apache.org> on 2020/05/20 15:45:00 UTC
[jira] [Comment Edited] (SPARK-31761) Sql Div operator can result
in incorrect output for int_min
[ https://issues.apache.org/jira/browse/SPARK-31761?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17112368#comment-17112368 ]
Sandeep Katta edited comment on SPARK-31761 at 5/20/20, 3:44 PM:
-----------------------------------------------------------------
[~sowen] [~hyukjin.kwon]
I have executed the same query in spark-2.4.4 it works as per expectation.
As you can see from 2.4.4 plan, columns are casted to double, so there won't be *Integer overflow.*
== Parsed Logical Plan ==
'Project [cast(('col0 / 'col1) as bigint) AS CAST((col0 / col1) AS BIGINT)#4|#4]
+- Relation[col0#0,col1#1|#0,col1#1] csv
== Analyzed Logical Plan ==
CAST((col0 / col1) AS BIGINT): bigint
Project [cast((cast(col0#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L|#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L]
+- Relation[col0#0,col1#1|#0,col1#1] csv
== Optimized Logical Plan ==
Project [cast((cast(col0#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L|#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L]
+- Relation[col0#0,col1#1|#0,col1#1] csv
== Physical Plan ==
*(1) Project [cast((cast(col0#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L|#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L]
+- *(1) FileScan csv [col0#0,col1#1|#0,col1#1] Batched: false, Format: CSV, Location: InMemoryFileIndex[file:/opt/fordebug/divTest.csv|file:///opt/fordebug/divTest.csv], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<col0:int,col1:int>
*(1) Project [cast((cast(col0#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L|#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L]
+- *(1) FileScan csv [col0#0,col1#1|#0,col1#1] Batched: false, Format: CSV, Location: InMemoryFileIndex[file:/opt/fordebug/divTest.csv|file:///opt/fordebug/divTest.csv], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<col0:int,col1:int>
*Spark-3.0 Plan*
== Parsed Logical Plan ==
'Project [('col0 div 'col1) AS (col0 div col1)#4|#4]
+- RelationV2[col0#0, col1#1|#0, col1#1] csv [file:/opt/fordebug/divTest.csv|file:///opt/fordebug/divTest.csv]
== Analyzed Logical Plan ==
(col0 div col1): int
Project [(col0#0 div col1#1) AS (col0 div col1)#4|#0 div col1#1) AS (col0 div col1)#4]
+- RelationV2[col0#0, col1#1|#0, col1#1] csv [file:/opt/fordebug/divTest.csv|file:///opt/fordebug/divTest.csv]
== Optimized Logical Plan ==
Project [(col0#0 div col1#1) AS (col0 div col1)#4|#0 div col1#1) AS (col0 div col1)#4]
+- RelationV2[col0#0, col1#1|#0, col1#1] csv [file:/opt/fordebug/divTest.csv|file:///opt/fordebug/divTest.csv]
== Physical Plan ==
*(1) Project [(col0#0 div col1#1) AS (col0 div col1)#4|#0 div col1#1) AS (col0 div col1)#4]
+- BatchScan[col0#0, col1#1|#0, col1#1] CSVScan Location: InMemoryFileIndex[file:/opt/fordebug/divTest.csv|file:///opt/fordebug/divTest.csv], ReadSchema: struct<col0:int,col1:int>
In Spark3 do I need to cast the columns as in spark-2.4, or user should manually add cast to their query as per below example
val schema = "col0 int,col1 int";
val df = spark.read.schema(schema).csv("file:/opt/fordebug/divTest.csv");
val res = df.selectExpr("col0 div col1")
val res = df.selectExpr("Cast(col0 as Decimal) div col1 ")
res.collect
please let us know your opinion
was (Author: sandeep.katta2007):
[~sowen] [~hyukjin.kwon]
I have executed the same query in spark-2.4.4 it works as per expectation.
As you can see from 2.4.4 plan, columns are casted to double, so there won't be *Integer overflow.*
== Parsed Logical Plan ==
'Project [cast(('col0 / 'col1) as bigint) AS CAST((col0 / col1) AS BIGINT)#4]
+- Relation[col0#0,col1#1] csv
== Analyzed Logical Plan ==
CAST((col0 / col1) AS BIGINT): bigint
Project [cast((cast(col0#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L]
+- Relation[col0#0,col1#1] csv
== Optimized Logical Plan ==
Project [cast((cast(col0#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L]
+- Relation[col0#0,col1#1] csv
== Physical Plan ==
*(1) Project [cast((cast(col0#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L]
+- *(1) FileScan csv [col0#0,col1#1] Batched: false, Format: CSV, Location: InMemoryFileIndex[file:/opt/fordebug/divTest.csv], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<col0:int,col1:int>
*(1) Project [cast((cast(col0#0 as double) / cast(col1#1 as double)) as bigint) AS CAST((col0 / col1) AS BIGINT)#4L]
+- *(1) FileScan csv [col0#0,col1#1] Batched: false, Format: CSV, Location: InMemoryFileIndex[file:/opt/fordebug/divTest.csv], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<col0:int,col1:int>
Spark-3.0
== Parsed Logical Plan ==
'Project [('col0 div 'col1) AS (col0 div col1)#4]
+- RelationV2[col0#0, col1#1] csv file:/opt/fordebug/divTest.csv
== Analyzed Logical Plan ==
(col0 div col1): int
Project [(col0#0 div col1#1) AS (col0 div col1)#4]
+- RelationV2[col0#0, col1#1] csv file:/opt/fordebug/divTest.csv
== Optimized Logical Plan ==
Project [(col0#0 div col1#1) AS (col0 div col1)#4]
+- RelationV2[col0#0, col1#1] csv file:/opt/fordebug/divTest.csv
== Physical Plan ==
*(1) Project [(col0#0 div col1#1) AS (col0 div col1)#4]
+- BatchScan[col0#0, col1#1] CSVScan Location: InMemoryFileIndex[file:/opt/fordebug/divTest.csv], ReadSchema: struct<col0:int,col1:int>
In Spark3 do I need to cast the columns as in spark-2.4, or user should manually add cast to their query as per below example
val schema = "col0 int,col1 int";
val df = spark.read.schema(schema).csv("file:/opt/fordebug/divTest.csv");
val res = df.selectExpr("col0 div col1")
val res = df.selectExpr("Cast(col0 as Decimal) div col1 ")
res.collect
please let us know your opinion
> Sql Div operator can result in incorrect output for int_min
> -----------------------------------------------------------
>
> Key: SPARK-31761
> URL: https://issues.apache.org/jira/browse/SPARK-31761
> Project: Spark
> Issue Type: Bug
> Components: SQL
> Affects Versions: 3.0.0
> Reporter: Kuhu Shukla
> Priority: Major
>
> Input in csv : -2147483648,-1 --> (_c0, _c1)
> {code}
> val res = df.selectExpr("_c0 div _c1")
> res.collect
> res1: Array[org.apache.spark.sql.Row] = Array([-2147483648])
> {code}
> The result should be 2147483648 instead.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@spark.apache.org
For additional commands, e-mail: issues-help@spark.apache.org