You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by gu...@apache.org on 2019/01/03 03:02:15 UTC

[spark] branch master updated: [SPARK-26403][SQL] Support pivoting using array column for `pivot(column)` API

This is an automated email from the ASF dual-hosted git repository.

gurwls223 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/master by this push:
     new 56967b7  [SPARK-26403][SQL] Support pivoting using array column for `pivot(column)` API
56967b7 is described below

commit 56967b7e288ac54e705b14a21516df5402d4c9d9
Author: Hyukjin Kwon <gu...@apache.org>
AuthorDate: Thu Jan 3 11:01:54 2019 +0800

    [SPARK-26403][SQL] Support pivoting using array column for `pivot(column)` API
    
    ## What changes were proposed in this pull request?
    
    This PR fixes `pivot(Column)` can accepts `collection.mutable.WrappedArray`.
    
    Note that we return `collection.mutable.WrappedArray` from `ArrayType`, and `Literal.apply` doesn't support this.
    
    We can unwrap the array and use it for type dispatch.
    
    ```scala
    val df = Seq(
      (2, Seq.empty[String]),
      (2, Seq("a", "x")),
      (3, Seq.empty[String]),
      (3, Seq("a", "x"))).toDF("x", "s")
    df.groupBy("x").pivot("s").count().show()
    ```
    
    Before:
    
    ```
    Unsupported literal type class scala.collection.mutable.WrappedArray$ofRef WrappedArray()
    java.lang.RuntimeException: Unsupported literal type class scala.collection.mutable.WrappedArray$ofRef WrappedArray()
    	at org.apache.spark.sql.catalyst.expressions.Literal$.apply(literals.scala:80)
    	at org.apache.spark.sql.RelationalGroupedDataset.$anonfun$pivot$2(RelationalGroupedDataset.scala:427)
    	at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:237)
    	at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
    	at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
    	at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:39)
    	at scala.collection.TraversableLike.map(TraversableLike.scala:237)
    	at scala.collection.TraversableLike.map$(TraversableLike.scala:230)
    	at scala.collection.AbstractTraversable.map(Traversable.scala:108)
    	at org.apache.spark.sql.RelationalGroupedDataset.pivot(RelationalGroupedDataset.scala:425)
    	at org.apache.spark.sql.RelationalGroupedDataset.pivot(RelationalGroupedDataset.scala:406)
    	at org.apache.spark.sql.RelationalGroupedDataset.pivot(RelationalGroupedDataset.scala:317)
    	at org.apache.spark.sql.DataFramePivotSuite.$anonfun$new$1(DataFramePivotSuite.scala:341)
    	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
    ```
    
    After:
    
    ```
    +---+---+------+
    |  x| []|[a, x]|
    +---+---+------+
    |  3|  1|     1|
    |  2|  1|     1|
    +---+---+------+
    ```
    
    ## How was this patch tested?
    
    Manually tested and unittests were added.
    
    Closes #23349 from HyukjinKwon/SPARK-26403.
    
    Authored-by: Hyukjin Kwon <gu...@apache.org>
    Signed-off-by: Hyukjin Kwon <gu...@apache.org>
---
 .../org/apache/spark/sql/catalyst/expressions/literals.scala  |  1 +
 .../sql/catalyst/expressions/LiteralExpressionSuite.scala     |  2 ++
 .../test/scala/org/apache/spark/sql/DataFramePivotSuite.scala | 11 +++++++++++
 3 files changed, 14 insertions(+)

diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala
index 34d2528..48beffa 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/literals.scala
@@ -67,6 +67,7 @@ object Literal {
     case t: Timestamp => Literal(DateTimeUtils.fromJavaTimestamp(t), TimestampType)
     case d: Date => Literal(DateTimeUtils.fromJavaDate(d), DateType)
     case a: Array[Byte] => Literal(a, BinaryType)
+    case a: collection.mutable.WrappedArray[_] => apply(a.array)
     case a: Array[_] =>
       val elementType = componentTypeToDataType(a.getClass.getComponentType())
       val dataType = ArrayType(elementType)
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/LiteralExpressionSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/LiteralExpressionSuite.scala
index 3ea6bfa..133aaa4 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/LiteralExpressionSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/LiteralExpressionSuite.scala
@@ -179,6 +179,8 @@ class LiteralExpressionSuite extends SparkFunSuite with ExpressionEvalHelper {
     checkArrayLiteral(Array("a", "b", "c"))
     checkArrayLiteral(Array(1.0, 4.0))
     checkArrayLiteral(Array(CalendarInterval.MICROS_PER_DAY, CalendarInterval.MICROS_PER_HOUR))
+    val arr = collection.mutable.WrappedArray.make(Array(1.0, 4.0))
+    checkEvaluation(Literal(arr), toCatalyst(arr))
   }
 
   test("seq") {
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/DataFramePivotSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/DataFramePivotSuite.scala
index b52ca58..8c2c11b 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/DataFramePivotSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/DataFramePivotSuite.scala
@@ -333,4 +333,15 @@ class DataFramePivotSuite extends QueryTest with SharedSQLContext {
     }
     assert(exception.getMessage.contains("Unsupported literal type"))
   }
+
+  test("SPARK-26403: pivoting by array column") {
+    val df = Seq(
+      (2, Seq.empty[String]),
+      (2, Seq("a", "x")),
+      (3, Seq.empty[String]),
+      (3, Seq("a", "x"))).toDF("x", "s")
+    val expected = Seq((3, 1, 1), (2, 1, 1)).toDF
+    val actual = df.groupBy("x").pivot("s").count()
+    checkAnswer(actual, expected)
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org