多个连续加入pyspark

Ahm*_*met 4 python apache-spark apache-spark-sql pyspark

我正在尝试将多个DF一起加入。因为联接是如何工作的,所以我得到了重复的相同列名。

在(K,V)和(K,W)类型的数据集上调用时,返回(K,(V,W))对的数据集,其中每个键都有所有成对的元素。

# Join Min and Max to S1
joinned_s1 = (minTime.join(maxTime, minTime["UserId"] == maxTime["UserId"]))

# Join S1 and sum to s2
joinned_s2 = (joinned_s1.join(sumTime, joinned_s1["UserId"] == sumTime["UserId"]))
Run Code Online (Sandbox Code Playgroud)

我收到此错误:“”参考'UserId'不明确,可能是:UserId#1578,UserId#3014。“

成功加入后,从数据集中删除W的正确方法是什么?

zer*_*323 5

您可以使用等参:

 minTime.join(maxTime, ["UserId"]).join(sumTime, ["UserId"])
Run Code Online (Sandbox Code Playgroud)

别名:

minTime.alias("minTime").join(
    maxTime.alias("maxTime"), 
    col("minTime.UserId") == col("maxTime.UserId")
)
Run Code Online (Sandbox Code Playgroud)

或引用父表:

(minTime
  .join(maxTime, minTime["UserId"] == maxTime["UserId"])
  .join(sumTime, minTime["UserId"] == sumTime["UserId"]))
Run Code Online (Sandbox Code Playgroud)

另外,您引用的是RDD文档,而不是文档DataFrame。这些是不同的数据结构,并且操作方式不同。

而且看起来您在这里做的事情很奇怪。假设您有一个父表minmax并且sum可以将其计算为简单的聚合而没有join


小智 5

如果您在列上连接两个数据框,那么这些列将会重复。因此,尝试使用数组或字符串来连接两个或多个数据框。

例如,如果加入列:

df = left.join(right, left.name == right.name)
Run Code Online (Sandbox Code Playgroud)

输出将包含两列“名称”。

现在如果你使用:

df = left.join(right, "name") OR df=left.join(right,["name"])
Run Code Online (Sandbox Code Playgroud)

那么输出将不会有重复的列。