You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@spark.apache.org by henryr <gi...@git.apache.org> on 2018/04/18 19:45:33 UTC

[GitHub] spark pull request #21073: [SPARK-23936][SQL] Implement map_concat

Github user henryr commented on a diff in the pull request:

    https://github.com/apache/spark/pull/21073#discussion_r182547477
  
    --- Diff: sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collectionOperations.scala ---
    @@ -115,6 +116,62 @@ case class MapValues(child: Expression)
       override def prettyName: String = "map_values"
     }
     
    +/**
    + * Returns the union of all the given maps.
    + */
    +@ExpressionDescription(
    +usage = "_FUNC_(map, ...) - Returns the union of all the given maps",
    +examples = """
    +    Examples:
    +      > SELECT _FUNC_(map(1, 'a', 2, 'b'), map(2, 'c', 3, 'd'));
    +       [[1 -> "a"], [2 -> "c"], [3 -> "d"]
    +  """)
    +case class MapConcat(children: Seq[Expression]) extends Expression
    +  with CodegenFallback {
    +
    +  override def checkInputDataTypes(): TypeCheckResult = {
    +    // this check currently does not allow valueContainsNull to vary,
    +    // and unfortunately none of the MapType toString methods include
    +    // valueContainsNull for the error message
    +    if (children.exists(!_.dataType.isInstanceOf[MapType])) {
    +      TypeCheckResult.TypeCheckFailure(
    +        s"The given input of function $prettyName should all be of type map, " +
    +          "but they are " + children.map(_.dataType.simpleString).mkString("[", ", ", "]"))
    +    } else if (children.map(_.dataType).distinct.length > 1) {
    +      TypeCheckResult.TypeCheckFailure(
    +        s"The given input maps of function $prettyName should all be the same type, " +
    +          "but they are " + children.map(_.dataType.simpleString).mkString("[", ", ", "]"))
    +    } else {
    +      TypeCheckResult.TypeCheckSuccess
    +    }
    +  }
    +  override def dataType: MapType = {
    +    children.headOption.map(_.dataType.asInstanceOf[MapType])
    +      .getOrElse(MapType(keyType = StringType, valueType = StringType))
    +  }
    +
    +  override def nullable: Boolean = false
    --- End diff --
    
    Hm, seems a bit unusual to me to have, in effect, `NULL ++ NULL => Map()`. I checked with Presto and it looks like it returns `NULL`:
    
        presto> select map_concat(NULL, NULL)
             -> ;
         _col0
        -------
         NULL
        (1 row)


---

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