CAST(...至STRING)和BASE64(...)有什么区别

时间:2019-06-02 06:49:31

标签: apache-spark apache-spark-sql

从VARBINARY转换为STRING时,我想知道Spark sql中的CAST(...至STRING)和BASE64(...)操作是否可以互换。如果没有,有什么区别?

1 个答案:

答案 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   |
+--------+