Join 在pyspark中水平连接多个数据帧

Join 在pyspark中水平连接多个数据帧,join,indexing,pyspark,apache-spark-sql,Join,Indexing,Pyspark,Apache Spark Sql,我正在尝试使用单调递增的\u id()在pyspark中水平连接多个数据帧(具有相同数量的记录)。然而,获得的结果夸大了记录的数量 for i in range(len(lst)+1): if i==0: df[i] = cust_mod.select('key') df[i+1] = df[i].withColumn("idx", monotonically_increasing_id()) else: df_tmp = o[i

我正在尝试使用单调递增的\u id()在pyspark中水平连接多个数据帧(具有相同数量的记录)。然而,获得的结果夸大了记录的数量

for i in range(len(lst)+1):
    if i==0:
        df[i] = cust_mod.select('key')
        df[i+1] = df[i].withColumn("idx", monotonically_increasing_id())

    else:
        df_tmp = o[i-1].select(col("value").alias(obj_names[i-1]))
        df_tmp = df_tmp.withColumn("idx", monotonically_increasing_id())

        df[i+1] = df[i].join(df_tmp, "idx", "outer")
df[i+1]中的预期记录数=~60m。得到:~88米。看起来单调递增的id并不是一直生成相同的数字。我怎样才能解决这个问题

其他详情:

cust_mod > dataframe, count- ~60m
o[i] - another set of dataframes, with length equal to cust_mod
lst - a list than has 49 components . So in total 49 loops
我尝试使用zipWithIndex():


但这太慢了。比如50倍的速度。

单调递增的\u id()
返回递增的数字,但不能保证它们是以任何顺序递增的。你几乎肯定不会在两次通话中得到相同的号码。您有几个选项—最简单的方法可能是转换到
rdd
并在这两个选项上调用
zipWithIndex()
,将它们连接起来,然后转换回
DF
。如果您可以根据这些值或如何对行进行排序来定义联接条件,则更好。zipWithIndex()似乎速度较慢。还有其他选择吗?单调地增加id()是fastIt的快速方式是的,但它也不正确(这两点是相关的)。请记住,数据帧(和RDD)本质上是无序的。这样做的正确方法是定义连接条件-那么
df
中的第一行意味着它应该对应于
df_tmp1
中的第一行呢?如果答案是“命令”,那么你就不走运了。您还可以选择在每一行中添加一个
行编号()
,但这也不会很快。是的。df的第一行对应于df_tmp1的第一行。行\u编号需要某些列作为订购依据。我没有这样的专栏
for i in range(len(lst)+1):
    if i==0:
        df[i] = cust_mod.select('key')
        df[i+1] = df[i].rdd.zipWithIndex().toDF()

    else:
        df_tmp = o[i-1].select("value").rdd.zipWithIndex().toDF()
        df_tmp1 = df_tmp.select(col("_1").alias(obj_names[i-1]),col("_2"))

        df[i+1] = df[i].join(df_tmp1, "_2", "inner").drop(df_tmp1._2)