HyukjinKwon opened a new pull request #25069: [SPARK-28270][SQL][PYTHON] 
Convert and port 'pgSQL/aggregates_part1.sql' into UDF test base
URL: https://github.com/apache/spark/pull/25069
 
 
   ## What changes were proposed in this pull request?
   
   This PR adds some tests in general. Please see contribution guide of this 
umbrella ticket - 
[SPARK-27921](https://issues.apache.org/jira/browse/SPARK-27921).
   
   This PR contains two minor fixes:
   
   1. Change name of Scala UDF from `UDF:name(...)` to `name(...)` to be 
consistent with Python'
   
   2. Fix Scala UDF at `IntegratedUDFTestUtils.scala ` to handle `null` in 
strings.
   
   
   <details><summary>Diff comparing to 'pgSQL/aggregates_part1.sql'</summary>
   <p>
   
   ```diff
   diff --git 
a/sql/core/src/test/resources/sql-tests/results/pgSQL/aggregates_part1.sql.out 
b/sql/core/src/test/resources/sql-tests/results/udf/pgSQL/udf-aggregates_part1.sql.out
   index 51ca1d55869..124fdd6416e 100644
   --- 
a/sql/core/src/test/resources/sql-tests/results/pgSQL/aggregates_part1.sql.out
   +++ 
b/sql/core/src/test/resources/sql-tests/results/udf/pgSQL/udf-aggregates_part1.sql.out
   @@ -3,7 +3,7 @@
   
   
    -- !query 0
   -SELECT avg(four) AS avg_1 FROM onek
   +SELECT avg(udf(four)) AS avg_1 FROM onek
    -- !query 0 schema
    struct<avg_1:double>
    -- !query 0 output
   @@ -11,15 +11,15 @@ struct<avg_1:double>
   
   
    -- !query 1
   -SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100
   +SELECT udf(avg(a)) AS avg_32 FROM aggtest WHERE a < 100
    -- !query 1 schema
   -struct<avg_32:double>
   +struct<avg_32:string>
    -- !query 1 output
    32.666666666666664
   
   
    -- !query 2
   -select CAST(avg(b) AS Decimal(10,3)) AS avg_107_943 FROM aggtest
   +select CAST(avg(udf(b)) AS Decimal(10,3)) AS avg_107_943 FROM aggtest
    -- !query 2 schema
    struct<avg_107_943:decimal(10,3)>
    -- !query 2 output
   @@ -27,285 +27,286 @@ struct<avg_107_943:decimal(10,3)>
   
   
    -- !query 3
   -SELECT sum(four) AS sum_1500 FROM onek
   +SELECT sum(udf(four)) AS sum_1500 FROM onek
    -- !query 3 schema
   -struct<sum_1500:bigint>
   +struct<sum_1500:double>
    -- !query 3 output
   -1500
   +1500.0
   
   
    -- !query 4
   -SELECT sum(a) AS sum_198 FROM aggtest
   +SELECT udf(sum(a)) AS sum_198 FROM aggtest
    -- !query 4 schema
   -struct<sum_198:bigint>
   +struct<sum_198:string>
    -- !query 4 output
    198
   
   
    -- !query 5
   -SELECT sum(b) AS avg_431_773 FROM aggtest
   +SELECT udf(udf(sum(b))) AS avg_431_773 FROM aggtest
    -- !query 5 schema
   -struct<avg_431_773:double>
   +struct<avg_431_773:string>
    -- !query 5 output
    431.77260909229517
   
   
    -- !query 6
   -SELECT max(four) AS max_3 FROM onek
   +SELECT udf(max(four)) AS max_3 FROM onek
    -- !query 6 schema
   -struct<max_3:int>
   +struct<max_3:string>
    -- !query 6 output
    3
   
   
    -- !query 7
   -SELECT max(a) AS max_100 FROM aggtest
   +SELECT max(udf(a)) AS max_100 FROM aggtest
    -- !query 7 schema
   -struct<max_100:int>
   +struct<max_100:string>
    -- !query 7 output
   -100
   +56
   
   
    -- !query 8
   -SELECT max(aggtest.b) AS max_324_78 FROM aggtest
   +SELECT CAST(udf(udf(max(aggtest.b))) AS int) AS max_324_78 FROM aggtest
    -- !query 8 schema
   -struct<max_324_78:float>
   +struct<max_324_78:int>
    -- !query 8 output
   -324.78
   +324
   
   
    -- !query 9
   -SELECT stddev_pop(b) FROM aggtest
   +SELECT CAST(stddev_pop(udf(b)) AS int) FROM aggtest
    -- !query 9 schema
   -struct<stddev_pop(CAST(b AS DOUBLE)):double>
   +struct<CAST(stddev_pop(CAST(udf(b) AS DOUBLE)) AS INT):int>
    -- !query 9 output
   -131.10703231895047
   +131
   
   
    -- !query 10
   -SELECT stddev_samp(b) FROM aggtest
   +SELECT udf(stddev_samp(b)) FROM aggtest
    -- !query 10 schema
   -struct<stddev_samp(CAST(b AS DOUBLE)):double>
   +struct<udf(stddev_samp(cast(b as double))):string>
    -- !query 10 output
    151.38936080399804
   
   
    -- !query 11
   -SELECT var_pop(b) FROM aggtest
   +SELECT CAST(var_pop(udf(b)) as int) FROM aggtest
    -- !query 11 schema
   -struct<var_pop(CAST(b AS DOUBLE)):double>
   +struct<CAST(var_pop(CAST(udf(b) AS DOUBLE)) AS INT):int>
    -- !query 11 output
   -17189.053923482323
   +17189
   
   
    -- !query 12
   -SELECT var_samp(b) FROM aggtest
   +SELECT udf(var_samp(b)) FROM aggtest
    -- !query 12 schema
   -struct<var_samp(CAST(b AS DOUBLE)):double>
   +struct<udf(var_samp(cast(b as double))):string>
    -- !query 12 output
    22918.738564643096
   
   
    -- !query 13
   -SELECT stddev_pop(CAST(b AS Decimal(38,0))) FROM aggtest
   +SELECT udf(stddev_pop(CAST(b AS Decimal(38,0)))) FROM aggtest
    -- !query 13 schema
   -struct<stddev_pop(CAST(CAST(b AS DECIMAL(38,0)) AS DOUBLE)):double>
   +struct<udf(stddev_pop(cast(cast(b as decimal(38,0)) as double))):string>
    -- !query 13 output
    131.18117242958306
   
   
    -- !query 14
   -SELECT stddev_samp(CAST(b AS Decimal(38,0))) FROM aggtest
   +SELECT stddev_samp(CAST(udf(b) AS Decimal(38,0))) FROM aggtest
    -- !query 14 schema
   -struct<stddev_samp(CAST(CAST(b AS DECIMAL(38,0)) AS DOUBLE)):double>
   +struct<stddev_samp(CAST(CAST(udf(b) AS DECIMAL(38,0)) AS DOUBLE)):double>
    -- !query 14 output
    151.47497042966097
   
   
    -- !query 15
   -SELECT var_pop(CAST(b AS Decimal(38,0))) FROM aggtest
   +SELECT udf(var_pop(CAST(b AS Decimal(38,0)))) FROM aggtest
    -- !query 15 schema
   -struct<var_pop(CAST(CAST(b AS DECIMAL(38,0)) AS DOUBLE)):double>
   +struct<udf(var_pop(cast(cast(b as decimal(38,0)) as double))):string>
    -- !query 15 output
    17208.5
   
   
    -- !query 16
   -SELECT var_samp(CAST(b AS Decimal(38,0))) FROM aggtest
   +SELECT var_samp(udf(CAST(b AS Decimal(38,0)))) FROM aggtest
    -- !query 16 schema
   -struct<var_samp(CAST(CAST(b AS DECIMAL(38,0)) AS DOUBLE)):double>
   +struct<var_samp(CAST(udf(cast(b as decimal(38,0))) AS DOUBLE)):double>
    -- !query 16 output
    22944.666666666668
   
   
    -- !query 17
   -SELECT var_pop(1.0), var_samp(2.0)
   +SELECT udf(var_pop(1.0)), var_samp(udf(2.0))
    -- !query 17 schema
   -struct<var_pop(CAST(1.0 AS DOUBLE)):double,var_samp(CAST(2.0 AS 
DOUBLE)):double>
   +struct<udf(var_pop(cast(1.0 as double))):string,var_samp(CAST(udf(2.0) AS 
DOUBLE)):double>
    -- !query 17 output
    0.0    NaN
   
   
    -- !query 18
   -SELECT stddev_pop(CAST(3.0 AS Decimal(38,0))), stddev_samp(CAST(4.0 AS 
Decimal(38,0)))
   +SELECT stddev_pop(udf(CAST(3.0 AS Decimal(38,0)))), 
stddev_samp(CAST(udf(4.0) AS Decimal(38,0)))
    -- !query 18 schema
   -struct<stddev_pop(CAST(CAST(3.0 AS DECIMAL(38,0)) AS 
DOUBLE)):double,stddev_samp(CAST(CAST(4.0 AS DECIMAL(38,0)) AS DOUBLE)):double>
   +struct<stddev_pop(CAST(udf(cast(3.0 as decimal(38,0))) AS 
DOUBLE)):double,stddev_samp(CAST(CAST(udf(4.0) AS DECIMAL(38,0)) AS 
DOUBLE)):double>
    -- !query 18 output
    0.0    NaN
   
   
    -- !query 19
   -select sum(CAST(null AS int)) from range(1,4)
   +select sum(udf(CAST(null AS int))) from range(1,4)
    -- !query 19 schema
   -struct<sum(CAST(NULL AS INT)):bigint>
   +struct<sum(CAST(udf(cast(null as int)) AS DOUBLE)):double>
    -- !query 19 output
    NULL
   
   
    -- !query 20
   -select sum(CAST(null AS long)) from range(1,4)
   +select sum(udf(CAST(null AS long))) from range(1,4)
    -- !query 20 schema
   -struct<sum(CAST(NULL AS BIGINT)):bigint>
   +struct<sum(CAST(udf(cast(null as bigint)) AS DOUBLE)):double>
    -- !query 20 output
    NULL
   
   
    -- !query 21
   -select sum(CAST(null AS Decimal(38,0))) from range(1,4)
   +select sum(udf(CAST(null AS Decimal(38,0)))) from range(1,4)
    -- !query 21 schema
   -struct<sum(CAST(NULL AS DECIMAL(38,0))):decimal(38,0)>
   +struct<sum(CAST(udf(cast(null as decimal(38,0))) AS DOUBLE)):double>
    -- !query 21 output
    NULL
   
   
    -- !query 22
   -select sum(CAST(null AS DOUBLE)) from range(1,4)
   +select sum(udf(CAST(null AS DOUBLE))) from range(1,4)
    -- !query 22 schema
   -struct<sum(CAST(NULL AS DOUBLE)):double>
   +struct<sum(CAST(udf(cast(null as double)) AS DOUBLE)):double>
    -- !query 22 output
    NULL
   
   
    -- !query 23
   -select avg(CAST(null AS int)) from range(1,4)
   +select avg(udf(CAST(null AS int))) from range(1,4)
    -- !query 23 schema
   -struct<avg(CAST(NULL AS INT)):double>
   +struct<avg(CAST(udf(cast(null as int)) AS DOUBLE)):double>
    -- !query 23 output
    NULL
   
   
    -- !query 24
   -select avg(CAST(null AS long)) from range(1,4)
   +select avg(udf(CAST(null AS long))) from range(1,4)
    -- !query 24 schema
   -struct<avg(CAST(NULL AS BIGINT)):double>
   +struct<avg(CAST(udf(cast(null as bigint)) AS DOUBLE)):double>
    -- !query 24 output
    NULL
   
   
    -- !query 25
   -select avg(CAST(null AS Decimal(38,0))) from range(1,4)
   +select avg(udf(CAST(null AS Decimal(38,0)))) from range(1,4)
    -- !query 25 schema
   -struct<avg(CAST(NULL AS DECIMAL(38,0))):decimal(38,4)>
   +struct<avg(CAST(udf(cast(null as decimal(38,0))) AS DOUBLE)):double>
    -- !query 25 output
    NULL
   
   
    -- !query 26
   -select avg(CAST(null AS DOUBLE)) from range(1,4)
   +select avg(udf(CAST(null AS DOUBLE))) from range(1,4)
    -- !query 26 schema
   -struct<avg(CAST(NULL AS DOUBLE)):double>
   +struct<avg(CAST(udf(cast(null as double)) AS DOUBLE)):double>
    -- !query 26 output
    NULL
   
   
    -- !query 27
   -select sum(CAST('NaN' AS DOUBLE)) from range(1,4)
   +select sum(CAST(udf('NaN') AS DOUBLE)) from range(1,4)
    -- !query 27 schema
   -struct<sum(CAST(NaN AS DOUBLE)):double>
   +struct<sum(CAST(udf(NaN) AS DOUBLE)):double>
    -- !query 27 output
    NaN
   
   
    -- !query 28
   -select avg(CAST('NaN' AS DOUBLE)) from range(1,4)
   +select avg(CAST(udf('NaN') AS DOUBLE)) from range(1,4)
    -- !query 28 schema
   -struct<avg(CAST(NaN AS DOUBLE)):double>
   +struct<avg(CAST(udf(NaN) AS DOUBLE)):double>
    -- !query 28 output
    NaN
   
   
    -- !query 29
    SELECT avg(CAST(x AS DOUBLE)), var_pop(CAST(x AS DOUBLE))
   -FROM (VALUES (CAST('1' AS DOUBLE)), (CAST('Infinity' AS DOUBLE))) v(x)
   +FROM (VALUES (CAST(udf('1') AS DOUBLE)), (CAST(udf('Infinity') AS DOUBLE))) 
v(x)
    -- !query 29 schema
   -struct<avg(CAST(x AS DOUBLE)):double,var_pop(CAST(x AS DOUBLE)):double>
   +struct<>
    -- !query 29 output
   -Infinity       NaN
   +org.apache.spark.sql.AnalysisException
   +cannot evaluate expression CAST(udf(1) AS DOUBLE) in inline table 
definition; line 2 pos 14
   
   
    -- !query 30
   -SELECT avg(CAST(x AS DOUBLE)), var_pop(CAST(x AS DOUBLE))
   +SELECT avg(CAST(udf(x) AS DOUBLE)), var_pop(CAST(udf(x) AS DOUBLE))
    FROM (VALUES ('Infinity'), ('1')) v(x)
    -- !query 30 schema
   -struct<avg(CAST(x AS DOUBLE)):double,var_pop(CAST(x AS DOUBLE)):double>
   +struct<avg(CAST(udf(x) AS DOUBLE)):double,var_pop(CAST(udf(x) AS 
DOUBLE)):double>
    -- !query 30 output
    Infinity       NaN
   
   
    -- !query 31
   -SELECT avg(CAST(x AS DOUBLE)), var_pop(CAST(x AS DOUBLE))
   +SELECT avg(CAST(udf(x) AS DOUBLE)), var_pop(CAST(udf(x) AS DOUBLE))
    FROM (VALUES ('Infinity'), ('Infinity')) v(x)
    -- !query 31 schema
   -struct<avg(CAST(x AS DOUBLE)):double,var_pop(CAST(x AS DOUBLE)):double>
   +struct<avg(CAST(udf(x) AS DOUBLE)):double,var_pop(CAST(udf(x) AS 
DOUBLE)):double>
    -- !query 31 output
    Infinity       NaN
   
   
    -- !query 32
   -SELECT avg(CAST(x AS DOUBLE)), var_pop(CAST(x AS DOUBLE))
   +SELECT avg(CAST(udf(x) AS DOUBLE)), var_pop(CAST(udf(x) AS DOUBLE))
    FROM (VALUES ('-Infinity'), ('Infinity')) v(x)
    -- !query 32 schema
   -struct<avg(CAST(x AS DOUBLE)):double,var_pop(CAST(x AS DOUBLE)):double>
   +struct<avg(CAST(udf(x) AS DOUBLE)):double,var_pop(CAST(udf(x) AS 
DOUBLE)):double>
    -- !query 32 output
    NaN    NaN
   
   
    -- !query 33
   -SELECT avg(CAST(x AS DOUBLE)), var_pop(CAST(x AS DOUBLE))
   +SELECT avg(udf(CAST(x AS DOUBLE))), udf(var_pop(CAST(x AS DOUBLE)))
    FROM (VALUES (100000003), (100000004), (100000006), (100000007)) v(x)
    -- !query 33 schema
   -struct<avg(CAST(x AS DOUBLE)):double,var_pop(CAST(x AS DOUBLE)):double>
   +struct<avg(CAST(udf(cast(x as double)) AS 
DOUBLE)):double,udf(var_pop(cast(x as double))):string>
    -- !query 33 output
    1.00000005E8   2.5
   
   
    -- !query 34
   -SELECT avg(CAST(x AS DOUBLE)), var_pop(CAST(x AS DOUBLE))
   +SELECT avg(udf(CAST(x AS DOUBLE))), udf(var_pop(CAST(x AS DOUBLE)))
    FROM (VALUES (7000000000005), (7000000000007)) v(x)
    -- !query 34 schema
   -struct<avg(CAST(x AS DOUBLE)):double,var_pop(CAST(x AS DOUBLE)):double>
   +struct<avg(CAST(udf(cast(x as double)) AS 
DOUBLE)):double,udf(var_pop(cast(x as double))):string>
    -- !query 34 output
    7.000000000006E12      1.0
   
   
    -- !query 35
   -SELECT covar_pop(b, a), covar_samp(b, a) FROM aggtest
   +SELECT CAST(udf(covar_pop(b, udf(a))) AS int), CAST(covar_samp(udf(b), a) 
as int) FROM aggtest
    -- !query 35 schema
   -struct<covar_pop(CAST(b AS DOUBLE), CAST(a AS 
DOUBLE)):double,covar_samp(CAST(b AS DOUBLE), CAST(a AS DOUBLE)):double>
   +struct<CAST(udf(covar_pop(cast(b as double), cast(udf(a) as double))) AS 
INT):int,CAST(covar_samp(CAST(udf(b) AS DOUBLE), CAST(a AS DOUBLE)) AS INT):int>
    -- !query 35 output
   -653.6289553875104      871.5052738500139
   +653    871
   
   
    -- !query 36
   -SELECT corr(b, a) FROM aggtest
   +SELECT corr(b, udf(a)) FROM aggtest
    -- !query 36 schema
   -struct<corr(CAST(b AS DOUBLE), CAST(a AS DOUBLE)):double>
   +struct<corr(CAST(b AS DOUBLE), CAST(udf(a) AS DOUBLE)):double>
    -- !query 36 output
    0.1396345165178734
   
   
    -- !query 37
   -SELECT count(four) AS cnt_1000 FROM onek
   +SELECT count(udf(four)) AS cnt_1000 FROM onek
    -- !query 37 schema
    struct<cnt_1000:bigint>
    -- !query 37 output
   @@ -313,36 +314,36 @@ struct<cnt_1000:bigint>
   
   
    -- !query 38
   -SELECT count(DISTINCT four) AS cnt_4 FROM onek
   +SELECT udf(count(DISTINCT four)) AS cnt_4 FROM onek
    -- !query 38 schema
   -struct<cnt_4:bigint>
   +struct<cnt_4:string>
    -- !query 38 output
    4
   
   
    -- !query 39
   -select ten, count(*), sum(four) from onek
   +select ten, udf(count(*)), sum(udf(four)) from onek
    group by ten order by ten
    -- !query 39 schema
   -struct<ten:int,count(1):bigint,sum(four):bigint>
   +struct<ten:int,udf(count(1)):string,sum(CAST(udf(four) AS DOUBLE)):double>
    -- !query 39 output
   -0      100     100
   -1      100     200
   -2      100     100
   -3      100     200
   -4      100     100
   -5      100     200
   -6      100     100
   -7      100     200
   -8      100     100
   -9      100     200
   +0      100     100.0
   +1      100     200.0
   +2      100     100.0
   +3      100     200.0
   +4      100     100.0
   +5      100     200.0
   +6      100     100.0
   +7      100     200.0
   +8      100     100.0
   +9      100     200.0
   
   
    -- !query 40
   -select ten, count(four), sum(DISTINCT four) from onek
   +select ten, count(udf(four)), udf(sum(DISTINCT four)) from onek
    group by ten order by ten
    -- !query 40 schema
   -struct<ten:int,count(four):bigint,sum(DISTINCT four):bigint>
   +struct<ten:int,count(udf(four)):bigint,udf(sum(distinct cast(four as 
bigint))):string>
    -- !query 40 output
    0      100     2
    1      100     4
   @@ -357,11 +358,11 @@ struct<ten:int,count(four):bigint,sum(DISTINCT 
four):bigint>
   
   
    -- !query 41
   -select ten, sum(distinct four) from onek a
   +select ten, udf(sum(distinct four)) from onek a
    group by ten
   -having exists (select 1 from onek b where sum(distinct a.four) = b.four)
   +having exists (select 1 from onek b where udf(sum(distinct a.four)) = 
b.four)
    -- !query 41 schema
   -struct<ten:int,sum(DISTINCT four):bigint>
   +struct<ten:int,udf(sum(distinct cast(four as bigint))):string>
    -- !query 41 output
    0      2
    2      2
   @@ -374,23 +375,23 @@ struct<ten:int,sum(DISTINCT four):bigint>
    select ten, sum(distinct four) from onek a
    group by ten
    having exists (select 1 from onek b
   -               where sum(distinct a.four + b.four) = b.four)
   +               where sum(distinct a.four + b.four) = udf(b.four))
    -- !query 42 schema
    struct<>
    -- !query 42 output
    org.apache.spark.sql.AnalysisException
   
    Aggregate/Window/Generate expressions are not valid in where clause of the 
query.
   -Expression in where clause: [(sum(DISTINCT CAST((outer() + b.`four`) AS 
BIGINT)) = CAST(b.`four` AS BIGINT))]
   +Expression in where clause: [(sum(DISTINCT CAST((outer() + b.`four`) AS 
BIGINT)) = CAST(udf(four) AS BIGINT))]
    Invalid expressions: [sum(DISTINCT CAST((outer() + b.`four`) AS BIGINT))];
   
   
    -- !query 43
    select
   -  (select max((select i.unique2 from tenk1 i where i.unique1 = o.unique1)))
   +  (select udf(max((select i.unique2 from tenk1 i where i.unique1 = 
o.unique1))))
    from tenk1 o
    -- !query 43 schema
    struct<>
    -- !query 43 output
    org.apache.spark.sql.AnalysisException
   -cannot resolve '`o.unique1`' given input columns: [i.even, i.fivethous, 
i.four, i.hundred, i.odd, i.string4, i.stringu1, i.stringu2, i.ten, i.tenthous, 
i.thousand, i.twenty, i.two, i.twothousand, i.unique1, i.unique2]; line 2 pos 63
   +cannot resolve '`o.unique1`' given input columns: [i.even, i.fivethous, 
i.four, i.hundred, i.odd, i.string4, i.stringu1, i.stringu2, i.ten, i.tenthous, 
i.thousand, i.twenty, i.two, i.twothousand, i.unique1, i.unique2]; line 2 pos 67
   ```
   
   </p>
   </details>
   
   Note that, currently, `IntegratedUDFTestUtils.scala`'s UDFs only return 
strings. There are some differences between those UDFs (Scala, Pandas and 
Python):
   
     - Python's string representation of floats can make the tests flaky. (See 
https://docs.python.org/3/tutorial/floatingpoint.html). To work around this, I 
had to `CAST(... as int)`.
     - There are string representation differences between `Inf` `-Inf` <> 
`Infinity` `-Infinity` and  `nan` <> `NaN`
     - One issue found - SPARK-28291. The test was commented for now.
   
   ## How was this patch tested?
   
   Tested as guided in 
[SPARK-27921](https://issues.apache.org/jira/browse/SPARK-27921).

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to