Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark PySpark一次性完成分区上的第一个和最后一个函数_Apache Spark_Pyspark_Apache Spark Sql_Pyspark Dataframes - Fatal编程技术网

Apache spark PySpark一次性完成分区上的第一个和最后一个函数

Apache spark PySpark一次性完成分区上的第一个和最后一个函数,apache-spark,pyspark,apache-spark-sql,pyspark-dataframes,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Dataframes,我有这样的pyspark代码 spark_df = spark_df.orderBy('id', 'a1', 'c1') out_df = spark_df.groupBy('id', 'a1', 'a2').agg( F.first('c1').alias('c1'), F.last('c2').alias('c2'), F.first('c3').alias('c3')) 我需要按顺序id a1和c1对数据进行排序。然后在键id、a1和c1上定义的组上选择如上所示的

我有这样的pyspark代码

spark_df = spark_df.orderBy('id', 'a1', 'c1')
out_df = spark_df.groupBy('id', 'a1', 'a2').agg(
    F.first('c1').alias('c1'),
    F.last('c2').alias('c2'),
    F.first('c3').alias('c3'))
我需要按顺序id a1和c1对数据进行排序。然后在键id、a1和c1上定义的组上选择如上所示的列

由于第一个和最后一个非决定论,我将代码更改为这个看起来很难看的代码,但我不确定这是否有效

w_first = Window.partitionBy('id', 'a1', 'a2').orderBy('c1')
w_last = Window.partitionBy('id', 'a1', 'a2').orderBy(F.desc('c1'))

out_first = spark_df.withColumn('Rank_First', F.rank().over(w_first)).filter(F.col('Rank_First') == 1).drop(
    'Rank_First')
out_last = spark_df.withColumn('Rank_Last', F.rank().over(w_last)).filter(F.col('Rank_First') == 1).drop(
    'Rank_Last')

out_first = out_first.withColumnRenamed('c1', 'First_c1') \
    .withColumnRenamed('c2', 'First_c2') \
    .withColumnRenamed('c3', 'First_c3')

out_last = out_last.withColumnRenamed('c1', 'Last_c1') \
    .withColumnRenamed('c2', 'Last_c2') \
    .withColumnRenamed('c3', 'Last_c3')

out_df = out_first.join(out_last, ['id', 'a1', 'a2']) \
    .select('id', 'a1', 'a2', F.col('First_c1').alias('c1'),
            F.col('Last_c2').alias('c2'),
            F.col('First_c3').alias('c3'))
我在努力寻找更好、更有效的替代方案。当数据量很大时,我会遇到性能瓶颈


是否有更好的替代方法可以一次性对按特定顺序排序的窗口执行“先到后”操作。

您仍然可以通过使用带有排序的
窗口
来保证
最后一个
第一个
函数的确定性,并且在指定窗口时需要定义
行之间的边界,以便
last
给出了正确的值(与此一致)

试试这个:

w = Window.partitionBy('id', 'a1', 'a2').orderBy('c1') \
          .rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)

df = df.withColumn("First_c1", first("c1").over(w)) \
      .withColumn("First_c3", first("c3").over(w)) \
      .withColumn("Last_c2", last("c2").over(w))

df.groupby("id", "a1", "a2")\
  .agg(first("First_c1").alias("c1"),
       first("Last_c2").alias("c2"),
       first("First_c3").alias("c3")
  ).show()

但我希望得到与groupby和first类似的结果。基本上,我希望通过键消除组中的重复项,并选择其他列。这不能保证。我将按预期获得更多行。是的,您可以在此步骤后分组或选择distinct以获得所需的结果。它应该仍然比计算两个DFs并加入它们更有效。是的,同意这一点。你能添加groupby语句并使答案为“complete”吗?当分区的by数据太大时,我仍然得到不同的结果。有什么办法吗?