【发布时间】:2021-03-21 07:06:08
【问题描述】:
我在sql server中有一个使用下面select语句的进程
SELECT HASHBYTES('SHA1', CAST('4100119300' AS NVARCHAR(100))) AS StringConverted
这给你:0x66A2F63C04A3A85347AD2F5CD99F1113F1BDD9CE
我一直试图在 Spark SQL 中重新创建相同的结果,但没有运气。
我在 Spark 中尝试过这个 sha1(encode('4100119300','utf-8'))
但是这样做的结果是:b4cf5aae8ce3dc1673da4949cfdf2edfa33fdba4
在我的测试过程中,如果我删除 sql 区域中的演员表,结果在 spark 中是相同的。我看到的问题是,在 spark 中您无法指定字符串的大小,或者可能正在更改过程中的编码。我已经有使用 nvarchar(100) 散列的 sql 中的数据,并且无法从 spark 等效项中删除它。
有什么建议吗?
【问题讨论】:
-
sha1(encode('4100119300','utf-8')正在散列一个 UTF-8 编码的字符串。select hashbytes('SHA1', CAST('4100119300' as nvarchar(100)))正在散列 UCS-2 编码字符串(即:每个字符两个字节)。这就是为什么你会得到不同的答案。 -
对于 USC-2,您的意思是 UTF-16 吗?
-
不,我特指UCS-2。这与 UTF-16 不同。虽然您可以从应用程序将 UTF-16 数据读取和写入 nchar/nvarchar/ntext 字段,但没有任何 SQL Server 字符串函数会在存在补充字符的情况下为您提供正确的结果,除非当前数据库正在使用补充字符 (_SC)排序规则。
-
例如:在默认 en-US 排序规则为
SQL_Latin1_General_CP1_CI_AS的数据库中尝试使用 U+1F600 笑脸表情符号字符:select nchar(128512)进行以下测试,然后在使用Latin1_General_100_CI_AS_SC。在第一个数据库中,nchar(128512)返回 null,在第二个数据库中,您将获得您的笑脸表情符号。 -
所以我必须找到一种方法将字符串编码为 USC-2,然后在 Spark 中运行哈希函数?我在想 nvarchar 演员将字符串转换为 utf 并在 spark 中尝试了 utf-8 和 16,但没有运气。我会试着找到这个转换,谢谢。
标签: sql sql-server apache-spark databricks