From 6959061f02b02afd4cef683b5eea0b7097eedee7 Mon Sep 17 00:00:00 2001 From: Wenchen Fan Date: Tue, 26 Jul 2016 15:33:05 +0800 Subject: [SPARK-16706][SQL] support java map in encoder ## What changes were proposed in this pull request? finish the TODO, create a new expression `ExternalMapToCatalyst` to iterate the map directly. ## How was this patch tested? new test in `JavaDatasetSuite` Author: Wenchen Fan Closes #14344 from cloud-fan/java-map. --- .../org/apache/spark/sql/JavaDatasetSuite.java | 58 ++++++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) (limited to 'sql/core/src/test') diff --git a/sql/core/src/test/java/test/org/apache/spark/sql/JavaDatasetSuite.java b/sql/core/src/test/java/test/org/apache/spark/sql/JavaDatasetSuite.java index a711811f41..96e8fb0668 100644 --- a/sql/core/src/test/java/test/org/apache/spark/sql/JavaDatasetSuite.java +++ b/sql/core/src/test/java/test/org/apache/spark/sql/JavaDatasetSuite.java @@ -497,6 +497,8 @@ public class JavaDatasetSuite implements Serializable { private String[] d; private List e; private List f; + private Map g; + private Map, Map> h; public boolean isA() { return a; @@ -546,6 +548,22 @@ public class JavaDatasetSuite implements Serializable { this.f = f; } + public Map getG() { + return g; + } + + public void setG(Map g) { + this.g = g; + } + + public Map, Map> getH() { + return h; + } + + public void setH(Map, Map> h) { + this.h = h; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -558,7 +576,10 @@ public class JavaDatasetSuite implements Serializable { if (!Arrays.equals(c, that.c)) return false; if (!Arrays.equals(d, that.d)) return false; if (!e.equals(that.e)) return false; - return f.equals(that.f); + if (!f.equals(that.f)) return false; + if (!g.equals(that.g)) return false; + return h.equals(that.h); + } @Override @@ -569,6 +590,8 @@ public class JavaDatasetSuite implements Serializable { result = 31 * result + Arrays.hashCode(d); result = 31 * result + e.hashCode(); result = 31 * result + f.hashCode(); + result = 31 * result + g.hashCode(); + result = 31 * result + h.hashCode(); return result; } } @@ -648,6 +671,17 @@ public class JavaDatasetSuite implements Serializable { obj1.setD(new String[]{"hello", null}); obj1.setE(Arrays.asList("a", "b")); obj1.setF(Arrays.asList(100L, null, 200L)); + Map map1 = new HashMap(); + map1.put(1, "a"); + map1.put(2, "b"); + obj1.setG(map1); + Map nestedMap1 = new HashMap(); + nestedMap1.put("x", "1"); + nestedMap1.put("y", "2"); + Map, Map> complexMap1 = new HashMap<>(); + complexMap1.put(Arrays.asList(1L, 2L), nestedMap1); + obj1.setH(complexMap1); + SimpleJavaBean obj2 = new SimpleJavaBean(); obj2.setA(false); obj2.setB(30); @@ -655,6 +689,16 @@ public class JavaDatasetSuite implements Serializable { obj2.setD(new String[]{null, "world"}); obj2.setE(Arrays.asList("x", "y")); obj2.setF(Arrays.asList(300L, null, 400L)); + Map map2 = new HashMap(); + map2.put(3, "c"); + map2.put(4, "d"); + obj2.setG(map2); + Map nestedMap2 = new HashMap(); + nestedMap2.put("q", "1"); + nestedMap2.put("w", "2"); + Map, Map> complexMap2 = new HashMap<>(); + complexMap2.put(Arrays.asList(3L, 4L), nestedMap2); + obj2.setH(complexMap2); List data = Arrays.asList(obj1, obj2); Dataset ds = spark.createDataset(data, Encoders.bean(SimpleJavaBean.class)); @@ -673,21 +717,27 @@ public class JavaDatasetSuite implements Serializable { new byte[]{1, 2}, new String[]{"hello", null}, Arrays.asList("a", "b"), - Arrays.asList(100L, null, 200L)}); + Arrays.asList(100L, null, 200L), + map1, + complexMap1}); Row row2 = new GenericRow(new Object[]{ false, 30, new byte[]{3, 4}, new String[]{null, "world"}, Arrays.asList("x", "y"), - Arrays.asList(300L, null, 400L)}); + Arrays.asList(300L, null, 400L), + map2, + complexMap2}); StructType schema = new StructType() .add("a", BooleanType, false) .add("b", IntegerType, false) .add("c", BinaryType) .add("d", createArrayType(StringType)) .add("e", createArrayType(StringType)) - .add("f", createArrayType(LongType)); + .add("f", createArrayType(LongType)) + .add("g", createMapType(IntegerType, StringType)) + .add("h",createMapType(createArrayType(LongType), createMapType(StringType, StringType))); Dataset ds3 = spark.createDataFrame(Arrays.asList(row1, row2), schema) .as(Encoders.bean(SimpleJavaBean.class)); Assert.assertEquals(data, ds3.collectAsList()); -- cgit v1.2.3