Skip to content

Commit 30cbd88

Browse files
authored
[VL] Enable map_concat function (#8781)
1 parent 50f18dc commit 30cbd88

File tree

7 files changed

+31
-2
lines changed

7 files changed

+31
-2
lines changed

backends-clickhouse/src/main/scala/org/apache/gluten/utils/CHExpressionUtil.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ object CHExpressionUtil {
204204
STACK -> DefaultValidator(),
205205
RAISE_ERROR -> DefaultValidator(),
206206
WIDTH_BUCKET -> DefaultValidator(),
207-
MAKE_DATE -> DefaultValidator()
207+
MAKE_DATE -> DefaultValidator(),
208+
MAP_CONCAT -> DefaultValidator()
208209
)
209210
}

backends-velox/src/test/scala/org/apache/gluten/execution/ScalarFunctionsValidateSuite.scala

+18
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,24 @@ abstract class ScalarFunctionsValidateSuite extends FunctionsValidateSuite {
578578
}
579579
}
580580

581+
test("map_concat") {
582+
withTempPath {
583+
path =>
584+
Seq(
585+
Map[String, Int]("a" -> 1, "b" -> 2),
586+
Map[String, Int]("a" -> 2, "b" -> 3),
587+
null
588+
)
589+
.toDF("m")
590+
.write
591+
.parquet(path.getCanonicalPath)
592+
spark.read.parquet(path.getCanonicalPath).createOrReplaceTempView("map_tbl")
593+
runQueryAndCompare("select map_concat(m, map('c', 4)) from map_tbl") {
594+
checkGlutenOperatorMatch[ProjectExecTransformer]
595+
}
596+
}
597+
}
598+
581599
test("map_filter") {
582600
withTempPath {
583601
path =>

cpp/core/config/GlutenConfig.h

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ const std::string kSparkRedactionString = "*********(redacted)";
7575

7676
const std::string kSparkLegacyTimeParserPolicy = "spark.sql.legacy.timeParserPolicy";
7777
const std::string kShuffleFileBufferSize = "spark.shuffle.file.buffer";
78+
const std::string kSparkMapKeyDedupPolicy = "spark.sql.mapKeyDedupPolicy";
7879

7980
std::unordered_map<std::string, std::string>
8081
parseConfMap(JNIEnv* env, const uint8_t* planData, const int32_t planDataLength);

cpp/velox/compute/WholeStageResultIterator.cc

+6
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,12 @@ std::unordered_map<std::string, std::string> WholeStageResultIterator::getQueryC
566566
configs[velox::core::QueryConfig::kSparkLegacyDateFormatter] = "false";
567567
}
568568

569+
if (veloxCfg_->get<std::string>(kSparkMapKeyDedupPolicy, "") == "EXCEPTION") {
570+
configs[velox::core::QueryConfig::kThrowExceptionOnDuplicateMapKeys] = "true";
571+
} else {
572+
configs[velox::core::QueryConfig::kThrowExceptionOnDuplicateMapKeys] = "false";
573+
}
574+
569575
const auto setIfExists = [&](const std::string& glutenKey, const std::string& veloxKey) {
570576
const auto valueOptional = veloxCfg_->get<std::string>(glutenKey);
571577
if (valueOptional.hasValue()) {

gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala

+1
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ object ExpressionMappings {
259259
// Map functions
260260
Sig[CreateMap](CREATE_MAP),
261261
Sig[GetMapValue](GET_MAP_VALUE),
262+
Sig[MapConcat](MAP_CONCAT),
262263
Sig[MapKeys](MAP_KEYS),
263264
Sig[MapValues](MAP_VALUES),
264265
Sig[MapFromArrays](MAP_FROM_ARRAYS),

shims/common/src/main/scala/org/apache/gluten/config/GlutenConfig.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,8 @@ object GlutenConfig {
506506
(
507507
GLUTEN_COLUMNAR_TO_ROW_MEM_THRESHOLD.key,
508508
GLUTEN_COLUMNAR_TO_ROW_MEM_THRESHOLD.defaultValue.get.toString),
509-
(SPARK_SHUFFLE_SPILL_COMPRESS, SPARK_SHUFFLE_SPILL_COMPRESS_DEFAULT.toString)
509+
(SPARK_SHUFFLE_SPILL_COMPRESS, SPARK_SHUFFLE_SPILL_COMPRESS_DEFAULT.toString),
510+
(SQLConf.MAP_KEY_DEDUP_POLICY.key, SQLConf.MAP_KEY_DEDUP_POLICY.defaultValueString)
510511
)
511512
keyWithDefault.forEach(e => nativeConfMap.put(e._1, conf.getOrElse(e._1, e._2)))
512513
GlutenConfigUtil.mapByteConfValue(

shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala

+1
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ object ExpressionNames {
282282
// Map functions
283283
final val CREATE_MAP = "map"
284284
final val GET_MAP_VALUE = "get_map_value"
285+
final val MAP_CONCAT = "map_concat"
285286
final val MAP_KEYS = "map_keys"
286287
final val MAP_VALUES = "map_values"
287288
final val MAP_FROM_ARRAYS = "map_from_arrays"

0 commit comments

Comments
 (0)