Python 按特定顺序为每个唯一ID指定多个字符串行

Python 按特定顺序为每个唯一ID指定多个字符串行,python,apache-spark,hive,pyspark,apache-spark-sql,Python,Apache Spark,Hive,Pyspark,Apache Spark Sql,我想创建一个表,其中每一行都是一个唯一的ID,“地点和城市”列包含一个人访问过的所有地点和城市,按访问日期排序,使用Pyspark或Hive df.groupby("ID").agg(F.concat_ws("|",F.collect_list("Place"))) 没有连接,但我无法按日期订购。同样,对于每一个专栏,我都需要单独完成这一步 我也尝试过使用本文中提到的windows函数,() 但是它出现了一个错误:java.lang.UnsupportedOperationExcepti

我想创建一个表,其中每一行都是一个唯一的ID,“地点和城市”列包含一个人访问过的所有地点和城市,按访问日期排序,使用Pyspark或Hive

   df.groupby("ID").agg(F.concat_ws("|",F.collect_list("Place")))
没有连接,但我无法按日期订购。同样,对于每一个专栏,我都需要单独完成这一步

我也尝试过使用本文中提到的windows函数,() 但是它出现了一个错误:java.lang.UnsupportedOperationException:“collect_list(')在窗口操作中不受支持。 我想:

1-按行程日期顺序排列连接的列

2-对多个列执行此步骤

资料

期望

| ID | Place       | City          | 

| 1  |  UK,SIN,MAL |  Birm,Sin,KL  |
| 2  |  US,US      |  LA,SF        |
| 3  |  UK         |  Lon          |

可能是重复的谢谢。第一个解决方案不能用于多列,使用windows函数的解决方案引发错误:java.lang.UnsupportedOperationException:“收集列表('Place')在窗口操作中不受支持。您使用的Spark版本是什么?窗口函数不能与太旧的版本一起使用(请参见,例如:)。我正在窗口中使用order by,它将根据ID处理您的订单。请在我的代码(第3行)中检查w。引发错误:ava.lang.UnsupportedOperationException:'收集列表('Place')在窗口操作中不受支持。您使用的是哪种Spark版本?你导入了我提到的所有软件包吗?您使用的是收集列表(“地点”)还是收集列表(地点)?
| ID | Place       | City          | 

| 1  |  UK,SIN,MAL |  Birm,Sin,KL  |
| 2  |  US,US      |  LA,SF        |
| 3  |  UK         |  Lon          |
>>> from pyspark.sql import functions as F
>>> from pyspark.sql import Window
>>> w = Window.partitionBy('ID').orderBy('Date')

//Input data frame
>>> df.show()
+---+----+-----+----+
| ID|Date|Place|City|
+---+----+-----+----+
|  1|2017|   UK|Birm|
|  2|2014|   US|  LA|
|  1|2018|  SIN| Sin|
|  1|2019|  MAL|  KL|
|  2|2015|   US|  SF|
|  3|2019|   UK| Lon|
+---+----+-----+----+

>>> df2 = df.withColumn("Place",F.collect_list("Place").over(w)).withColumn("City",F.collect_list("City").over(w)).groupBy("ID").agg(F.max("Place").alias("Place"), F.max("City").alias("City"))

 //Data value in List
>>> df2.show()
+---+--------------+---------------+
| ID|         Place|           City|
+---+--------------+---------------+
|  3|          [UK]|          [Lon]|
|  1|[UK, SIN, MAL]|[Birm, Sin, KL]|
|  2|      [US, US]|       [LA, SF]|
+---+--------------+---------------+


//If you want value in String 
>>> df2.withColumn("Place", F.concat_ws(" ", "Place")).withColumn("City", F.concat_ws(" ", "City")).show()
+---+----------+-----------+
| ID|     Place|       City|
+---+----------+-----------+
|  3|        UK|        Lon|
|  1|UK SIN MAL|Birm Sin KL|
|  2|     US US|      LA SF|
+---+----------+-----------+