你好,
我們在移動的過程從sql server數據倉庫到數據磚。我們測試過程中尺寸產品表的標識列的引用事實表為代理鍵。
磚應用變化SCD 2型我們推薦生成自申請變更不允許標識列。我試著散列()函數使用的兩列組合使用concat_ws()和傳遞concat_ws散列函數的結果。它生成大int但也產生消極的價值觀。
用戶函數像MD5、SHA1 SHA2所有生成的字符串函數。有xxhash64生成大INT不確定它還生成負數。
我的問題是任何一個知道的哈希函數將產生相同的散列數字(積極)的數量嗎?如果不是我們可能會使用SHA1,用戶或SHA2函數。我問在美國辦公時間磚的家夥建議張貼在社區論壇這裏嚐試。
@Nathan Sundararajan:
當使用哈希函數在磚或任何其他的係統中,重要的是要理解,哈希函數不是專門設計產生積極或消極的數字。哈希函數的輸出通常是一個二進製字符串或數字表示,如一個整數或一個十六進製值。
如果您需要一個積極的數字表示法,一種選擇是使用xxhash64函數在磚。xxhash64是一個64位的哈希函數,可以產生積極的整數值。然而,值得注意的是,哈希函數不能保證產生獨特的對每一個輸入值,所以碰撞(即。,多個輸入產生相同的散列)可能發生的。
如果獨特性的關鍵要求是你的代理鍵,您可能要考慮使用一種不同的方法,如使用序列生成代理鍵或UUID(全局惟一標識符)。這些方法提供了獨特的每一行的值不依賴哈希函數。
另外,你提到使用SCD 2型維度表。在這種情況下,您通常會指定一個新的代理鍵一發生改變的維度。這可以通過使用一個組合的自然/業務鍵和增量序列或時間戳以確保代理鍵的唯一性和秩序。
@Nathan Sundararajan:好的,我明白了,你是對的。自從XXhash64函數磚可以產生正麵和負麵的價值。確保生成的散列值是積極的,您可以應用逐位和操作的位掩碼。這裏有一個例子:
從pyspark.sql。功能導入xxhash64 df = df。withColumn (surrogate_key, xxhash64 (concat_ws (‘-’, df。col1 df.col2) & 0 x7fffffffffffffff)
請讓我知道如果這有幫助。