Dataframe 在spark数据帧中生成哈希键(数据帧中的唯一标识符列)

Dataframe 在spark数据帧中生成哈希键(数据帧中的唯一标识符列),dataframe,hash,pyspark,apache-spark-sql,md5,Dataframe,Hash,Pyspark,Apache Spark Sql,Md5,我有一张超过10万行的表格。我需要从连接的列中生成唯一的id,这将是唯一的。我已经尝试过md5函数,它可以很好地处理较少的数据,但对于大量数据,值会被复制。 您能否提供任何替代解决方案,或者我如何使其适合100k数据行 val df = Seq( ("Veg", "tomato", 1.99), ("Veg", "potato", 0.45), ("Fruit", "apple", 0.99),

我有一张超过10万行的表格。我需要从连接的列中生成唯一的id,这将是唯一的。我已经尝试过md5函数,它可以很好地处理较少的数据,但对于大量数据,值会被复制。 您能否提供任何替代解决方案,或者我如何使其适合100k数据行

val df = Seq(
              ("Veg", "tomato", 1.99),
              ("Veg", "potato", 0.45),
              ("Fruit", "apple", 0.99),
              ("Fruit", "pineapple", 2.59)
               ).toDF("Type", "Item", "Price")

df.withColumn("hash_value",md5(concat($"Type",$"Item",$"Price"))).show(false)

+-----+---------+-----+--------------------------------+
|Type |Item     |Price|hash_value                      |
+-----+---------+-----+--------------------------------+
|Veg  |tomato   |1.99 |82215bc9c2078d2f1e773ad62b4f88c6|
|Veg  |potato   |0.45 |5c68bcadcbfdedf8b8c6edca20fd5126|
|Fruit|apple    |0.99 |830a70f1c16f015aa54ca24d9ea6ce0b|
|Fruit|pineapple|2.59 |1f0974817391905d41224e76735fc5d4|
+-----+---------+-----+--------------------------------+

如何为连接的列创建唯一标识符?

我建议您使用sha 256或512以避免冲突:

df.withColumn(
“哈希值”,
F.sha2(
海螺(*(
F.col(col.cast)(“字符串”)
为上校
在df列中
)),
256
)
).show()

我建议您使用sha 256或512以避免冲突:

df.withColumn(
“哈希值”,
F.sha2(
海螺(*(
F.col(col.cast)(“字符串”)
为上校
在df列中
)),
256
)
).show()
Scala中的语法:

如有必要,使用大写和修剪规范化字符串:

“修剪()”和“上部()

scala中的解决方案如下所示:

import org.apache.spark.sql.functions._

val df = Seq(
              ("Veg", "tomato", 1.99),
              ("Veg", "potato", 0.45),
              ("Fruit", "apple", 0.99),
              ("Fruit", "pineapple", 2.59)
               ).toDF("Type", "Item", "Price")

df.withColumn("hash_value",sha2(concat($"Type",$"Item",$"Price"),256)).show(false)


+-----+---------+-----+----------------------------------------------------------------+
|Type |Item     |Price|hash_value                                                      |
+-----+---------+-----+----------------------------------------------------------------+
|Veg  |tomato   |1.99 |a9770f4457e613bcd20ebb47d50e374f9b7de6d0ff0d19e4f246b09a9505af67|
|Veg  |potato   |0.45 |367e976594aa71d73d69cc5ca2e4ab523ec64be88210f5b61da76f92142770c3|
|Fruit|apple    |0.99 |da52a8e67132cf43a8fe39e3e97ed5759e9aa3f16140320a0f82664e10eea136|
|Fruit|pineapple|2.59 |df0353ab978049e27e8ff809a804b452b0f3b06321b494b903aea432fa4203c2|
+-----+---------+-----+----------------------------------------------------------------+
Scala中的语法:

如有必要,使用大写和修剪规范化字符串:

“修剪()”和“上部()

scala中的解决方案如下所示:

import org.apache.spark.sql.functions._

val df = Seq(
              ("Veg", "tomato", 1.99),
              ("Veg", "potato", 0.45),
              ("Fruit", "apple", 0.99),
              ("Fruit", "pineapple", 2.59)
               ).toDF("Type", "Item", "Price")

df.withColumn("hash_value",sha2(concat($"Type",$"Item",$"Price"),256)).show(false)


+-----+---------+-----+----------------------------------------------------------------+
|Type |Item     |Price|hash_value                                                      |
+-----+---------+-----+----------------------------------------------------------------+
|Veg  |tomato   |1.99 |a9770f4457e613bcd20ebb47d50e374f9b7de6d0ff0d19e4f246b09a9505af67|
|Veg  |potato   |0.45 |367e976594aa71d73d69cc5ca2e4ab523ec64be88210f5b61da76f92142770c3|
|Fruit|apple    |0.99 |da52a8e67132cf43a8fe39e3e97ed5759e9aa3f16140320a0f82664e10eea136|
|Fruit|pineapple|2.59 |df0353ab978049e27e8ff809a804b452b0f3b06321b494b903aea432fa4203c2|
+-----+---------+-----+----------------------------------------------------------------+

您可以尝试sha256或SHA512您可以尝试sha256或SHA512来添加更多的细节:您能描述一下上面编写的代码吗。我正在尝试实现类似的功能,但上面的代码给出的错误是::6:error:“)”预期为“for”,但找到了“for”。我使用Scala作为language@NikunjKakadiya这是一个括号问题。您可能忘记了我示例中的一个括号。请查收。但在Scala中,语法可能有所不同。@Nikunkakadiya不知道,但基本上,它只是对转换为字符串的所有列的一个concat。要添加更多细节,请描述一下上面编写的代码。我正在尝试实现类似的功能,但上面的代码给出的错误是::6:error:“)”预期为“for”,但找到了“for”。我使用Scala作为language@NikunjKakadiya这是一个括号问题。您可能忘记了我示例中的一个括号。请查收。但在Scala中,语法可能不同。@Nikunkakadiya不知道,但基本上,它只是一个覆盖所有转换为字符串的列的concat。