与pyspark进行多次连续加入

时间:2016-07-19 21:08:52

标签: python apache-spark pyspark apache-spark-sql

我正在尝试将多个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"]))

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

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

2 个答案:

答案 0 :(得分:5)

您可以使用equi-join:

 publicDatabase.fetchAllSubscriptionsWithCompletionHandler { (subscriptions: [CKSubscription]?, error: NSError?) in
        if error != nil
        {
            print("-> cloudKitSubscribeToChat - fetch subscription error")
        }
        else
        {
            print("-> cloudKitSubscribeToChat - fetch subscription no error")
            if subscriptions?.count == 0
            {
                print("-> cloudKitSubscribeToChat - subscription count = 0, create")
                subscribe()
            }
            else
            {
                print("-> cloudKitSubscribeToChat - subscription count > 0, create")
                var exists = false
                for subscription in subscriptions!
                {
                    if subscription.predicate == predicate
                    {
                        print("-> cloudKitSubscribeToChat - subscription count > 0, true")
                        exists = true
                    }
                    else
                    {
                        print("-> cloudKitSubscribeToChat - subscription count > 0, false")
                        exists = false
                    }
                }
                if exists == false
                {
                    print("-> cloudKitSubscribeToChat - subscription do not exists, create")
                    subscribe()
                }
                else
                {
                    print("-> cloudKitSubscribeToChat - subscription already exists")
                    result(error: nil)
                }
            }
        }
    }

别名:

 minTime.join(maxTime, ["UserId"]).join(sumTime, ["UserId"])

或引用父表:

minTime.alias("minTime").join(
    maxTime.alias("maxTime"), 
    col("minTime.UserId") == col("maxTime.UserId")
)

在旁注中,您引用了(minTime .join(maxTime, minTime["UserId"] == maxTime["UserId"]) .join(sumTime, minTime["UserId"] == sumTime["UserId"])) 个文档,而不是RDD个文档。这些是不同的数据结构,不能以相同的方式运行。

此外看起来你在做一些奇怪的事情。假设您有一个父表DataFrameminmax可以计算为没有sum的简单聚合。

答案 1 :(得分:0)

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

例如,如果在列上联接:

df = left.join(right, left.name == right.name)

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

现在,如果您使用:

df = left.join(right, "name") OR df=left.join(right,["name"])

然后输出将没有重复的列。