Они (полностью) различны, когда при преобразовании двоичного кода в строку Spark интерпретирует байты как UTF-8 кодированные данные, тогда как Base64 кодирует байты в текст, используя некоторые распространенные печатные символы . Например, при преобразовании байта 33 в строку UTF-8 будет получена строка "!"
, поскольку точка 33 в Unicode является восклицательным знаком.
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 |
+--------+