PySpark Dataframe中的重复行基于另一列中的off值

PySpark Dataframe中的重复行基于另一列中的off值,dataframe,duplicates,pyspark,Dataframe,Duplicates,Pyspark,我有一个如下所示的数据帧: ID NumRecords 123 2 456 1 789 3 我想创建一个新的数据帧,它连接两列并根据NumRecords中的值复制行 所以输出应该是 ID_New 123-1 ID_New 123-2 ID_New 456-1 ID_New 789-1 ID_New 789-2 ID_New 789-3 我正在研究“explode”函数,但根据我看到的示例,它似乎只取了一个常量 您可以使用udf from pyspark.sql.

我有一个如下所示的数据帧:

ID    NumRecords
123   2
456   1
789   3
我想创建一个新的数据帧,它连接两列并根据NumRecords中的值复制行

所以输出应该是

ID_New  123-1
ID_New  123-2
ID_New  456-1
ID_New  789-1
ID_New  789-2
ID_New  789-3
我正在研究“explode”函数,但根据我看到的示例,它似乎只取了一个常量

您可以使用udf

from pyspark.sql.functions import udf, explode, concat_ws
from pyspark.sql.types import *

range_ = udf(lambda x: [str(y) for y in range(1, x + 1)], ArrayType(StringType()))

df.withColumn("records", range_("NumRecords") \
  .withColumn("record", explode("records")) \
  .withColumn("ID_New", concat_ws("-", "id", "record"))

我有一个类似的问题,这段代码将根据NumRecords列中的值复制行:

from pyspark.sql import Row


def duplicate_function(row):
    data = []  # list of rows to return
    to_duplicate = float(row["NumRecords"])

    i = 0
    while i < to_duplicate:
        row_dict = row.asDict()  # convert a Spark Row object to a Python dictionary
        row_dict["SERIAL_NO"] = str(i)
        new_row = Row(**row_dict)  # create a Spark Row object based on a Python dictionary
        to_return.append(new_row)  # adds this Row to the list
        i += 1

    return data  # returns the final list


# create final dataset based on value in NumRecords column
df_flatmap = df_input.rdd.flatMap(duplicate_function).toDF(df_input.schema)
从pyspark.sql导入行
def复制_功能(世界其他地区):
数据=[]#要返回的行列表
to_duplicate=浮动(行[“NumRecords”])
i=0
当我
我在df.withColumn(“记录”,range(“NumRecords”)上得到了“tuple对象不可调用”