使用python进行Spark流媒体:如何添加UUID列?

时间:2018-04-11 22:08:18

标签: python dataframe spark-structured-streaming

我想在我的数据框中添加一个带有生成ID的列。我试过了:

{{1}}

但是,当我这样做时,没有任何内容写入我的输出目录。当我删除这些行时,一切正常,所以必须有一些错误,但我在控制台中看不到任何内容。

我尝试过使用monotonically_increasing_id()而不是生成UUID,但在我的测试中,这会产生许多重复项。我需要一个唯一的标识符(不一定是UUID)。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

请试试这个:

import uuid
from pyspark.sql.functions import udf

uuidUdf= udf(lambda : str(uuid.uuid4()),StringType())
Df1 = Df.withColumn("id",uuidUdf())

注意:添加新列后,您应该分配给新的DF。 ( Df1 = Df.withColumn(....)

答案 1 :(得分:1)

来自pyspark的{​​{1}}:

注意:默认情况下,用户定义的函数被认为是确定性的。由于优化,与查询中存在的重复调用相比,可以消除重复调用,甚至可以多次调用函数。如果您的函数不确定,请在用户定义的函数上调用functions.py。例如:

asNondeterministic

因此对于UUID,这将是:

from pyspark.sql.types import IntegerType
import random
random_udf = udf(lambda: int(random.random() * 100), IntegerType()).asNondeterministic()

及其用法:

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
import uuid
random_udf = udf(lambda: str(uuid.uuid4()), StringType()).asNondeterministic()

答案 2 :(得分:0)

请使用lit函数,以便为所有记录生成相同的ID。 lit仅执行一次该功能,并获取列值并将其添加到每条记录。

>>> df.show(truncate=False)
+---+
|x  |
+---+
|0  |
|1  |
|2  |
|3  |
|4  |
|5  |
|6  |
|7  |
|8  |
|9  |
+---+
>>> import uuid
>>> id = str(uuid.uuid4())
>>> df = df.withColumn("id", lit(id))
>>> df.show(truncate=False)
+---+------------------------------------+
|x  |id                                  |
+---+------------------------------------+
|0  |923b69d6-4bee-423d-a892-79162df5684d|
|1  |923b69d6-4bee-423d-a892-79162df5684d|
|2  |923b69d6-4bee-423d-a892-79162df5684d|
|3  |923b69d6-4bee-423d-a892-79162df5684d|
|4  |923b69d6-4bee-423d-a892-79162df5684d|
|5  |923b69d6-4bee-423d-a892-79162df5684d|
|6  |923b69d6-4bee-423d-a892-79162df5684d|
|7  |923b69d6-4bee-423d-a892-79162df5684d|
|8  |923b69d6-4bee-423d-a892-79162df5684d|
|9  |923b69d6-4bee-423d-a892-79162df5684d|
+---+------------------------------------+

使用udf不能解决该函数,因为该函数在每一行都被调用,而最终每次调用都会得到新的uuid。

>>> df1 = df.withColumn("id",uuidUdf())
>>> uuidUdf= udf(lambda : str(uuid.uuid4()),StringType())
>>> df1 = df.withColumn("id",uuidUdf())
>>> df1.show(truncate=False)
+---+------------------------------------+
|x  |id                                  |
+---+------------------------------------+
|0  |6d051ec6-b91a-4c42-b37c-707a293f1dc8|
|1  |cd3c75b1-8a06-461b-82ae-51f4354296bd|
|2  |3996a022-de99-4403-9346-74e66210f9ef|
|3  |ad57a9c4-5c67-4545-bef6-77d89cff70d5|
|4  |5c9a82a1-323e-4ce0-9082-e36c5a6f61db|
|5  |7a64ee81-4c84-43d0-ab7d-0a79ed694950|
|6  |a0fb26e7-cf1a-445d-bd26-10dc453ddc1e|
|7  |435a7e6a-da22-4add-8953-b5c56b01c790|
|8  |fd3c5fd8-c9d5-4725-b32a-f3ce9386b9b8|
|9  |2291cc67-47cf-4921-80ec-b4180c73533c|
+---+------------------------------------+