Skip to content

Commit 08d97c8

Browse files
committed
throw exception when complex data type
1 parent 4615733 commit 08d97c8

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

sql/core/src/main/scala/org/apache/spark/sql/execution/BaseScriptTransformationExec.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,9 @@ trait BaseScriptTransformationExec extends UnaryExecNode {
216216
converter)
217217
case udt: UserDefinedType[_] =>
218218
wrapperConvertException(data => udt.deserialize(data), converter)
219+
case ArrayType(_, _) | MapType(_, _, _) | StructType(_) =>
220+
throw new SparkException("TRANSFORM without serde don't support" +
221+
" ArrayType/MapType/StructType as output data type")
219222
case _ => wrapperConvertException(data => data, converter)
220223
}
221224
}

sql/core/src/test/scala/org/apache/spark/sql/execution/SparkScriptTransformationSuite.scala

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
package org.apache.spark.sql.execution
1919

20-
import org.apache.spark.TestUtils
20+
import org.apache.spark.{SparkException, TestUtils}
2121
import org.apache.spark.sql.catalyst.expressions.{Attribute, Expression}
2222
import org.apache.spark.sql.catalyst.parser.ParseException
2323
import org.apache.spark.sql.test.SharedSparkSession
@@ -61,4 +61,43 @@ class SparkScriptTransformationSuite extends BaseScriptTransformationSuite with
6161
assert(e.contains("TRANSFORM with serde is only supported in hive mode"))
6262
}
6363
}
64+
65+
test("TRANSFORM don't support ArrayType/MapType/StructType as output data type (no serde)") {
66+
assume(TestUtils.testCommandAvailable("/bin/bash"))
67+
// check for ArrayType
68+
val e1 = intercept[SparkException] {
69+
sql(
70+
"""
71+
|SELECT TRANSFORM(a)
72+
|USING 'cat' AS (a array<int>)
73+
|FROM VALUES (array(1, 1), map('1', 1), struct(1, 'a')) t(a, b, c)
74+
""".stripMargin).collect()
75+
}.getMessage
76+
assert(e1.contains("TRANSFORM without serde don't support" +
77+
" ArrayType/MapType/StructType as output data type"))
78+
79+
// check for MapType
80+
val e2 = intercept[SparkException] {
81+
sql(
82+
"""
83+
|SELECT TRANSFORM(b)
84+
|USING 'cat' AS (b map<int, string>)
85+
|FROM VALUES (array(1, 1), map('1', 1), struct(1, 'a')) t(a, b, c)
86+
""".stripMargin).collect()
87+
}.getMessage
88+
assert(e2.contains("TRANSFORM without serde don't support" +
89+
" ArrayType/MapType/StructType as output data type"))
90+
91+
// check for StructType
92+
val e3 = intercept[SparkException] {
93+
sql(
94+
"""
95+
|SELECT TRANSFORM(c)
96+
|USING 'cat' AS (c struct<col1:int, col2:string>)
97+
|FROM VALUES (array(1, 1), map('1', 1), struct(1, 'a')) t(a, b, c)
98+
""".stripMargin).collect()
99+
}.getMessage
100+
assert(e3.contains("TRANSFORM without serde don't support" +
101+
" ArrayType/MapType/StructType as output data type"))
102+
}
64103
}

0 commit comments

Comments
 (0)