Apache spark Pyspark基于列值复制行

Apache spark Pyspark基于列值复制行,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,我希望根据每行上给定列的值复制数据帧中的所有行,然后为每一新行编制索引。假设我有: A列B列 T1 3 t22 我希望结果是: A列B列索引 T1 3 1 T1 3 2 T1 3 T2 2 1 t22 我能够用固定的值找到类似的东西,但不能使用列中的信息。我目前的固定值工作代码是: idx=[liti代表范围1中的i,10] df=df.withColumn'Index',数组idx 我试图改变: 这是我在第1、10区的成绩 到 范围1中i的liti,df[“B列”] 并将其添加到我的数组函数中

我希望根据每行上给定列的值复制数据帧中的所有行,然后为每一新行编制索引。假设我有:

A列B列 T1 3 t22 我希望结果是:

A列B列索引 T1 3 1 T1 3 2 T1 3 T2 2 1 t22 我能够用固定的值找到类似的东西,但不能使用列中的信息。我目前的固定值工作代码是:

idx=[liti代表范围1中的i,10] df=df.withColumn'Index',数组idx 我试图改变:

这是我在第1、10区的成绩 到

范围1中i的liti,df[“B列”] 并将其添加到我的数组函数中:

df=df.withColumn'Index',范围1中i的数组liti,df['Column B'] 但它不起作用TypeError:“Column”对象不能解释为整数

我应该如何实现这一点

不幸的是,你不能喜欢那样。您可以始终使用udf,但如果您使用的是Spark 2.1版或更高版本,我有一个非udf的黑客解决方案,它应该适合您

诀窍是利用获取索引值。我们通过重复逗号列B次来创建字符串来实现这一点。然后我们在逗号上拆分这个字符串,并使用posexplode获取索引

df.createOrReplaceTempViewdf首先将数据帧注册为临时表 查询='SELECT'\ “A列”\ “B列”\ “pos作为索引”\ “来自”\ “选择不同的”\ “A列”\ “B列”\ '重复,'B列','\ '从df作为一个'\ '其中a.pos>0' newDF=sqlCtx.sqlquery.sort列A,列B,索引 新秀 +----+----+---+ |A列| B列|索引| +----+----+---+ |T1 | 3 | 1| |T1 | 3 | 2| |T1 | 3 | 3| |T2 | 2 | 1| |T2 | 2 | 2| +----+----+---+
注意:您需要将列名换行,因为正如本文所述,列名中有空格:

great hacking@pault。但我有一个查询,如何将repeat中的列B作为基元而不是sql表达式中的列来处理。在api形式中,它被视为列,不是吗?@Ramesh我使用DataFrame函数很难实现这一点。我不知道为什么它在查询中起作用。@RameshMaharjan我发布了一篇关于这种行为的文章
You can try this:

    from pyspark.sql.window import Window
    from pyspark.sql.functions import *
    from pyspark.sql.types import ArrayType, IntegerType
    from pyspark.sql import functions as F
    df = spark.read.csv('/FileStore/tables/stack1.csv', header = 'True', inferSchema = 'True')

    w = Window.orderBy("Column A")
    df = df.select(row_number().over(w).alias("Index"), col("*"))

    n_to_array = udf(lambda n : [n] * n ,ArrayType(IntegerType()))
    df2 = df.withColumn('Column B', n_to_array('Column B'))
    df3= df2.withColumn('Column B', explode('Column B'))
    df3.show()