Skip to content
Snippets Groups Projects
Commit a2b3b676 authored by Michal Senkyr's avatar Michal Senkyr Committed by Wenchen Fan
Browse files

[SPARK-19089][SQL] Add support for nested sequences

## What changes were proposed in this pull request?

Replaced specific sequence encoders with generic sequence encoder to enable nesting of sequences.

Does not add support for nested arrays as that cannot be solved in this way.

## How was this patch tested?

```bash
build/mvn -DskipTests clean package && dev/run-tests
```

Additionally in Spark shell:

```
scala> Seq(Seq(Seq(1))).toDS.collect()
res0: Array[Seq[Seq[Int]]] = Array(List(List(1)))
```

Author: Michal Senkyr <mike.senkyr@gmail.com>

Closes #18011 from michalsenkyr/dataset-seq-nested.
parent 833c8d41
No related branches found
Tags v2.1.1
No related merge requests found
...@@ -111,93 +111,60 @@ abstract class SQLImplicits extends LowPrioritySQLImplicits { ...@@ -111,93 +111,60 @@ abstract class SQLImplicits extends LowPrioritySQLImplicits {
/** /**
* @since 1.6.1 * @since 1.6.1
* @deprecated use [[newIntSequenceEncoder]] * @deprecated use [[newSequenceEncoder]]
*/ */
def newIntSeqEncoder: Encoder[Seq[Int]] = ExpressionEncoder() def newIntSeqEncoder: Encoder[Seq[Int]] = ExpressionEncoder()
/** /**
* @since 1.6.1 * @since 1.6.1
* @deprecated use [[newLongSequenceEncoder]] * @deprecated use [[newSequenceEncoder]]
*/ */
def newLongSeqEncoder: Encoder[Seq[Long]] = ExpressionEncoder() def newLongSeqEncoder: Encoder[Seq[Long]] = ExpressionEncoder()
/** /**
* @since 1.6.1 * @since 1.6.1
* @deprecated use [[newDoubleSequenceEncoder]] * @deprecated use [[newSequenceEncoder]]
*/ */
def newDoubleSeqEncoder: Encoder[Seq[Double]] = ExpressionEncoder() def newDoubleSeqEncoder: Encoder[Seq[Double]] = ExpressionEncoder()
/** /**
* @since 1.6.1 * @since 1.6.1
* @deprecated use [[newFloatSequenceEncoder]] * @deprecated use [[newSequenceEncoder]]
*/ */
def newFloatSeqEncoder: Encoder[Seq[Float]] = ExpressionEncoder() def newFloatSeqEncoder: Encoder[Seq[Float]] = ExpressionEncoder()
/** /**
* @since 1.6.1 * @since 1.6.1
* @deprecated use [[newByteSequenceEncoder]] * @deprecated use [[newSequenceEncoder]]
*/ */
def newByteSeqEncoder: Encoder[Seq[Byte]] = ExpressionEncoder() def newByteSeqEncoder: Encoder[Seq[Byte]] = ExpressionEncoder()
/** /**
* @since 1.6.1 * @since 1.6.1
* @deprecated use [[newShortSequenceEncoder]] * @deprecated use [[newSequenceEncoder]]
*/ */
def newShortSeqEncoder: Encoder[Seq[Short]] = ExpressionEncoder() def newShortSeqEncoder: Encoder[Seq[Short]] = ExpressionEncoder()
/** /**
* @since 1.6.1 * @since 1.6.1
* @deprecated use [[newBooleanSequenceEncoder]] * @deprecated use [[newSequenceEncoder]]
*/ */
def newBooleanSeqEncoder: Encoder[Seq[Boolean]] = ExpressionEncoder() def newBooleanSeqEncoder: Encoder[Seq[Boolean]] = ExpressionEncoder()
/** /**
* @since 1.6.1 * @since 1.6.1
* @deprecated use [[newStringSequenceEncoder]] * @deprecated use [[newSequenceEncoder]]
*/ */
def newStringSeqEncoder: Encoder[Seq[String]] = ExpressionEncoder() def newStringSeqEncoder: Encoder[Seq[String]] = ExpressionEncoder()
/** /**
* @since 1.6.1 * @since 1.6.1
* @deprecated use [[newProductSequenceEncoder]] * @deprecated use [[newSequenceEncoder]]
*/ */
implicit def newProductSeqEncoder[A <: Product : TypeTag]: Encoder[Seq[A]] = ExpressionEncoder() def newProductSeqEncoder[A <: Product : TypeTag]: Encoder[Seq[A]] = ExpressionEncoder()
/** @since 2.2.0 */ /** @since 2.2.0 */
implicit def newIntSequenceEncoder[T <: Seq[Int] : TypeTag]: Encoder[T] = implicit def newSequenceEncoder[T <: Seq[_] : TypeTag]: Encoder[T] = ExpressionEncoder()
ExpressionEncoder()
/** @since 2.2.0 */
implicit def newLongSequenceEncoder[T <: Seq[Long] : TypeTag]: Encoder[T] =
ExpressionEncoder()
/** @since 2.2.0 */
implicit def newDoubleSequenceEncoder[T <: Seq[Double] : TypeTag]: Encoder[T] =
ExpressionEncoder()
/** @since 2.2.0 */
implicit def newFloatSequenceEncoder[T <: Seq[Float] : TypeTag]: Encoder[T] =
ExpressionEncoder()
/** @since 2.2.0 */
implicit def newByteSequenceEncoder[T <: Seq[Byte] : TypeTag]: Encoder[T] =
ExpressionEncoder()
/** @since 2.2.0 */
implicit def newShortSequenceEncoder[T <: Seq[Short] : TypeTag]: Encoder[T] =
ExpressionEncoder()
/** @since 2.2.0 */
implicit def newBooleanSequenceEncoder[T <: Seq[Boolean] : TypeTag]: Encoder[T] =
ExpressionEncoder()
/** @since 2.2.0 */
implicit def newStringSequenceEncoder[T <: Seq[String] : TypeTag]: Encoder[T] =
ExpressionEncoder()
/** @since 2.2.0 */
implicit def newProductSequenceEncoder[T <: Seq[Product] : TypeTag]: Encoder[T] =
ExpressionEncoder()
// Arrays // Arrays
......
...@@ -258,6 +258,11 @@ class DatasetPrimitiveSuite extends QueryTest with SharedSQLContext { ...@@ -258,6 +258,11 @@ class DatasetPrimitiveSuite extends QueryTest with SharedSQLContext {
ListClass(List(1)) -> Queue("test" -> SeqClass(Seq(2)))) ListClass(List(1)) -> Queue("test" -> SeqClass(Seq(2))))
} }
test("nested sequences") {
checkDataset(Seq(Seq(Seq(1))).toDS(), Seq(Seq(1)))
checkDataset(Seq(List(Queue(1))).toDS(), List(Queue(1)))
}
test("package objects") { test("package objects") {
import packageobject._ import packageobject._
checkDataset(Seq(PackageClass(1)).toDS(), PackageClass(1)) checkDataset(Seq(PackageClass(1)).toDS(), PackageClass(1))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment