Github user vofque commented on a diff in the pull request:
https://github.com/apache/spark/pull/22745#discussion_r227437560
--- Diff:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/objects/objects.scala
---
@@ -1787,3 +1788,79 @@ case class ValidateExternalType(child: Expression,
expected: DataType)
ev.copy(code = code, isNull = input.isNull)
}
}
+
+object GetKeyArrayFromMap {
+
+ /**
+ * Construct an instance of GetArrayFromMap case class
+ * extracting a key array from a Map expression.
+ *
+ * @param child a Map expression to extract a key array from
+ */
+ def apply(child: Expression): Expression = {
+ GetArrayFromMap(
+ child,
+ "keyArray",
+ _.keyArray(),
+ { case MapType(kt, _, _) => kt })
+ }
+}
+
+object GetValueArrayFromMap {
+
+ /**
+ * Construct an instance of GetArrayFromMap case class
+ * extracting a value array from a Map expression.
+ *
+ * @param child a Map expression to extract a value array from
+ */
+ def apply(child: Expression): Expression = {
+ GetArrayFromMap(
+ child,
+ "valueArray",
+ _.valueArray(),
+ { case MapType(_, vt, _) => vt })
+ }
+}
+
+/**
+ * Extracts a key/value array from a Map expression.
+ *
+ * @param child a Map expression to extract an array from
+ * @param functionName name of the function that is invoked to extract an
array
+ * @param arrayGetter function extracting `ArrayData` from `MapData`
+ * @param elementTypeGetter function extracting array element `DataType`
from `MapType`
+ */
+case class GetArrayFromMap private(
+ child: Expression,
+ functionName: String,
+ arrayGetter: MapData => ArrayData,
+ elementTypeGetter: MapType => DataType) extends UnaryExpression with
NonSQLExpression {
+
+ private lazy val encodedFunctionName: String =
TermName(functionName).encodedName.toString
+
+ lazy val dataType: DataType = {
+ val mt: MapType = child.dataType.asInstanceOf[MapType]
+ ArrayType(elementTypeGetter(mt))
+ }
+
+ override def checkInputDataTypes(): TypeCheckResult = {
+ child.dataType match {
+ case MapType(_, _, _) =>
--- End diff --
Yes, sure.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]