TypeError dropDuplicates() 接受 1 到 2 个位置参数,但给出了 3 个

TypeError dropDuplicates() takes from 1 to 2 positional arguments but 3 were given

我在 Spark 2 中播放流数据。

我想用 dropDuplicates 方法复制记录。

我在 Spark 网站上发现我可以将 dropDuplicateswatermark 一起使用。

这是我的带水印的代码,没有 dropDuplicates 方法:

parsed = parsed_opc \
    .withWatermark("sourceTimeStamp", "10 minutes") \
    .groupBy(
        window(parsed_opc.sourceTimeStamp, "4 seconds"),
        parsed_opc.id
    ) \
    .agg({"value": "avg"}) \
    .withColumnRenamed("avg(value)", "avg")\
    .orderBy("avg", ascending=True)

此代码有效。但是当我想像这样添加 dropDuplicates 时:

parsed = parsed_opc \
    .withWatermark("sourceTimeStamp", "10 minutes") \
    .dropDuplicates("id", "sourceTimeStamp") \
    .groupBy(
        window(parsed_opc.sourceTimeStamp, "4 seconds"),
        parsed_opc.id
    ) \
    .agg({"value": "avg"}) \
    .withColumnRenamed("avg(value)", "avg")\
    .orderBy("avg", ascending=True)

它抛出一个错误:TypeError: dropDuplicates() takes from 1 to 2 positional arguments but 3 were given

我不明白为什么会抛出这个错误。这种用法在 Spark 站点中也是如此。 这个错误的原因是什么?

您需要使用方括号在 dropDuplicates() 方法中声明多列。

像这样:

parsed = parsed_opc \
    .withWatermark("sourceTimeStamp", "10 minutes") \
    .dropDuplicates(["id", "sourceTimeStamp"]) \
    .groupBy(
        window(parsed_opc.sourceTimeStamp, "4 seconds"),
        parsed_opc.id
    ) \
    .agg({"value": "avg"}) \
    .withColumnRenamed("avg(value)", "avg")\
    .orderBy("avg", ascending=True)