Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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
Python 合并多个PySpark DataFrame行以从基于事件的数据转换为基于人的数据_Python_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 合并多个PySpark DataFrame行以从基于事件的数据转换为基于人的数据

Python 合并多个PySpark DataFrame行以从基于事件的数据转换为基于人的数据,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,假设我有一个数据帧,它是基于事件的顺序。基本上每次有事情发生,我都会收到一个新的事件,说有人改变了位置或工作。以下是示例输入的外观: +----+--+--------+--------+ |事件| id |名称|作业|位置| +----+--+--------+--------+ |10 |鲍勃|经理|| |9 |乔|总部| |8 |蒂姆|纽约办事处| |7 |乔| |纽约办事处| |6 |乔|首席程序员|| |5 |鲍勃|洛杉矶办公室| |4 |蒂姆|经理|总部| |3 |鲍勃| |纽约办事

假设我有一个数据帧,它是基于事件的顺序。基本上每次有事情发生,我都会收到一个新的事件,说有人改变了位置或工作。以下是示例输入的外观:

+----+--+--------+--------+ |事件| id |名称|作业|位置| +----+--+--------+--------+ |10 |鲍勃|经理|| |9 |乔|总部| |8 |蒂姆|纽约办事处| |7 |乔| |纽约办事处| |6 |乔|首席程序员|| |5 |鲍勃|洛杉矶办公室| |4 |蒂姆|经理|总部| |3 |鲍勃| |纽约办事处| |2 |鲍勃| DB管理员|总部| |1 |乔|程序员|总部| +----+--+--------+--------+ 在本例中,10是最新的事件,1是最早的事件。现在我想得到每个人的最新信息。以下是我想要的输出:

+--+--------+--------+ |名称|工作|地点| +--+--------+--------+ |鲍勃|经理|洛杉矶办事处| |乔|首席程序员|总部| |蒂姆|经理|纽约办事处| +--+--------+--------+
我目前进行这种重组的方式是收集数据,然后循环遍历事件,从最新到最旧,以便找到每个人的信息。这种方法的问题是,对于大型数据帧来说,速度非常慢,最终无法全部放在一台计算机的内存中。使用spark的正确方法是什么?

根据你的问题,我认为这就是你想要的

 val spark =
    SparkSession.builder().master("local").appName("test").getOrCreate()

  import spark.implicits._

  val data = spark.sparkContext.parallelize(
    Seq(
      (10, "Bob", "Manager", ""),
      (9, "Joe", "", "HQ"),
      (8, "Tim", "", "New York Office"),
      (7, "Joe", "", "New York Office"),
      (6, "Joe", "Head Programmer", ""),
      (5, "Bob", "", "LA Office"),
      (4, "Tim", "Manager", "HQ"),
      (3, "Bob", "", "New York Office"),
      (2, "Bob", "DB Administrator", "HQ"),
      (1, "Joe", "Programmer", "HQ")
    )).toDF("event_id", "name", "job", "location")

  val latest = data.groupBy("name").agg(max(data("event_id")).alias("event_id"))

  latest.join(data, "event_id").drop("event_id").show

这是一个scala代码,希望您能用Python将其转换为不能解决问题的代码。这将为我获取最新的引用,但它不会获取所有更新的字段。我想要每个人的最新工作和地点,而不是最新的记录