【问题标题】:How to convert hashbytes string from sql to spark equivalent如何将hashbytes字符串从sql转换为spark等价物
【发布时间】: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


【解决方案1】:

你看到这些差异了吗?

SELECT HASHBYTES('SHA1', CAST('4100119300' AS NVARCHAR(100))) AS StringConverted
-- 0x66A2F63C04A3A85347AD2F5CD99F1113F1BDD9CE
SELECT HASHBYTES('SHA1', '4100119300') AS StringConverted
-- 0xB4CF5AAE8CE3DC1673DA4949CFDF2EDFA33FDBA4

要将 varbytes 存储为字符串,我使用带有 style = 1 标志的 CONVERT (CAST & CONVERT)

SELECT CONVERT(VARCHAR(100), HASHBYTES('SHA1', '4100119300'), 1) AS StringConverted

这个就是你要找的。它只是小写的 Sparks b4cf5aae8ce3dc1673da4949cfdf2edfa33fdba4,没有 0x 前缀。

【讨论】:

  • 是的,问题是因为我们的数据是第一次选择使用哈希字节内的强制转换进行哈希处理的,我得到了不同的哈希值。是的,我尝试了您的第二种和第三种方法,并在 Spark 中使用 sha1 我得到了相同的结果,谢谢。
  • 结果 0x66A2F63C04A3A85347AD2F5CD99F1113F1BDD9CE 实际上是我想在 Spark 中复制的结果。
猜你喜欢
  • 2021-03-26
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多