目录
矩阵
矩阵是一个二维数组,通常由一系列行和列组成。在数学、物理、工程和计算机科学等领域中,矩阵被广泛用于表示和处理数据。在数据处理和分析中,矩阵经常用于表示表格数据,其中行通常表示观测值(如用户、样本等),列表示特征或变量(如用户属性、商品ID等)。
在Spark SQL中,DataFrame可以被视为一个二维数组,其中每行代表一个记录,每列代表一个字段。例如,一个包含用户购买记录的DataFrame,每行代表一个用户的购买信息,列可能包括user_id
和各个sku_id
的购买情况(经过one-hot编码后)。这样的DataFrame在内部可以视为一个二维数组的结构,尽管在Spark中我们不会直接操作这个二维数组结构,而是通过DataFrame API来进行数据处理和分析。
举例:
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
concat函数
concat($"user_id", lit(":"), $"sku_id")
这个表达式的作用是将user_id
列的值、字符串":"
(由lit(":")
生成)和sku_id
列的值连接在一起。
这里是每个部分的解释:
$"user_id"
和$"sku_id"
:这些是DataFrame中列的名称。$
符号是Spark SQL中用于引用列的特殊符号。lit(":")
:lit
是一个函数,用于将常量值(在这里是字符串":"
)作为列表达式传递。这允许你将常量值与其他列或表达式连接起来。concat
:这个函数接受多个列或表达式作为参数,并将它们的结果连接成一个字符串。
因此,如果user_id
列的值是123
,sku_id
列的值是456
,那么concat($"user_id", lit(":"), $"sku_id")
的结果将是字符串"123:456"
。
concat_ws函数
CONCAT_WS
函数也是用于连接两个或多个字符串,但它允许你指定一个分隔符,这个分隔符会被插入到连接的字符串之间。CONCAT_WS
中的“WS”代表“with separator”,即带分隔符的连接。
concat 和 concat_ws 的区别
处理NULL值的方式
- 在
CONCAT
函数中,如果任何参数为NULL,整个函数将返回NULL。这是因为CONCAT
函数在遇到NULL时不会进行任何连接操作。 - 在
CONCAT_WS
函数中,如果分隔符为NULL,则函数会返回NULL。但如果要连接的字符串中包含NULL值,这些NULL值会被忽略,而不会导致整个函数返回NULL。这意味着即使某些字符串参数是NULL,你仍然可以得到一个连接了其他非NULL字符串的结果。
举个例子,假设我们有两个字符串变量 str1
和 str2
,以及一个分隔符 sep
。如果 str1
是 "Hello",str2
是 NULL,sep
是 ", ":
- 使用
CONCAT(str1, sep, str2)
会返回 NULL,因为str2
是NULL。 - 使用
CONCAT_WS(sep, str1, str2)
会返回 "Hello",因为CONCAT_WS
会忽略NULL值,并仅连接非NULL的字符串。