从VARBINARY转换为STRING时,我想知道Spark sql中的CAST(...至STRING)和BASE64(...)操作是否可以互换。如果没有,有什么区别?
答案 0 :(得分:0)
(完全)不同,当将二进制数转换为字符串时,Spark将字节解释为 UTF-8 编码的数据,而将Base64解释为使用some common printable characters将字节编码为文本。例如,将字节33强制转换为UTF-8字符串将产生字符串"!"
,因为Unicode点33是感叹号。
val df = Seq(Array[Byte](33)).toDF("test")
df.select($"test".cast(StringType)).show()
+----+
|test|
+----+
| !|
+----+
和base64:
df.select(base64($"test")).show()
+------------+
|base64(test)|
+------------+
| IQ==|
+------------+
请注意,将字节强制转换为字符串采用UTF-8编码,因此
val df = Seq("foo".getBytes(StandardCharsets.UTF_8),
"foo".getBytes(StandardCharsets.UTF_16)).toDF("test")
df.select($"test".cast(StringType)).show()
输出:
+--------+
| test|
+--------+
| foo|
|���f�o�o |
+--------+