了解数据块中最不常见的类型

问题描述 投票:0回答:1

我正在阅读数据类型规则并发现了最不常见的类型。

我有疑问。 STRING 和 INT 最不常见的类型是什么?引用的链接给出了以下示例,说明最不常见的类型是 BIGINT。

-- The least common type between an INT and STRING is BIGINT
> SELECT typeof(coalesce(5, '6'));
  BIGINT

但是,如果我在 Databricks 13.3、Spark 3.4.1 和 Scala 2.12 配置上运行它,它将给出以下输出。

> SELECT typeof(coalesce(5, '6'));
  STRING

如果我对查询运行解释,则会得到以下输出。

> EXPLAIN EXTENDED SELECT typeof(coalesce(5, '6'));
== Analyzed Logical Plan ==
typeof(coalesce(5, 6)): string
Project [typeof(coalesce(cast(5 as string), 6)) AS typeof(coalesce(5, 6))#239637]
+- OneRowRelation

它表明 INT 被强制转换为 STRING,因此最不常见的类型应该是 STRING。

但是,如果我在 STRING 和 INT 之间运行等于运算,则解释查询会给出不同的输出。

> EXPLAIN EXTENDED SELECT '1.00' = 1;
== Analyzed Logical Plan ==
(1.00 = 1): boolean
Project [(cast(1.00 as int) = 1) AS (1.00 = 1)#239661]
+- OneRowRelation

此处 STRING 被转换为 INT。

coalesce
=
都依赖于最不常见的类型并给出不同的结果类型。那么,STRING 和 INT 中最不常见的类型到底是什么?另外,STRING 和 INT 哪个更窄?任何简单的数据类型都可以转换为 STRING,而不会丢失任何数据,就像 INT 可以转换为 STRING 而不会丢失任何数据一样。然而,反之则不然。如果将包含十进制值的 STRING 转换为 INT,则会出现值丢失。那么 STRING 不应该是更宽的类型吗?

apache-spark-sql databricks azure-databricks
1个回答
0
投票

STRINGINT之间最不常见的类型是STRING。 在 Databricks 和 Spark 中,使用

coalesce()
函数时,最不常见的类型由参数的顺序确定。

注意:当执行等于(=)操作时,Spark 会执行隐式类型转换。在本例中,STRING“1.00”成功转换为 INT,从而导致等于运算的两个操作数具有相同的类型 (INT)。

%sql
SELECT
  typeof(coalesce(value_int, value_string)) AS least_common_type
FROM
  test_table;

结果:

least_common_type
string
string
string
string

coalesce()
=
都依赖于最不常见的类型,但它们可能会根据操作和参数的顺序产生不同的结果类型。 一般来说,STRING被认为比 INT 更宽,因为任何简单的数据类型都可以安全地转换为 STRING,而不会丢失任何数据。

© www.soinside.com 2019 - 2024. All rights reserved.