Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 在行内对数据帧进行排序并获得排名_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Apache spark 在行内对数据帧进行排序并获得排名

Apache spark 在行内对数据帧进行排序并获得排名,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我有以下PySpark数据帧: +----+----------+----------+----------+ | id| a| b| c| +----+----------+----------+----------+ |2346|2017-05-26| null|2016-12-18| |5678|2013-05-07|2018-05-12| null| +----+----------+----------+------

我有以下PySpark数据帧:

+----+----------+----------+----------+
|  id|         a|         b|         c|
+----+----------+----------+----------+
|2346|2017-05-26|      null|2016-12-18|
|5678|2013-05-07|2018-05-12|      null|
+----+----------+----------+----------+
我的理想输出是:

+----+---+---+---+
|id  |a  |b  |c  |
+----+---+---+---+
|2346|2  |0  |1  |
|5678|1  |2  |0  |
+----+---+---+---+
即行内日期越近,得分越高


我看过类似的帖子,建议使用窗口功能。问题是我需要在行中而不是列中对值进行排序。

您可以将每行中的值放入一个数组中,并使用来对其进行排序

导入pyspark.sql.f函数 cols=[a,b,c] df=df.select*,f.sort\u arrayf.array[f.colc代表cols中的c].aliassorted df.showtruncate=False +--+-----+-----+-----+---------------+ |id | a | b | c |已排序| +--+-----+-----+-----+---------------+ |2346 | 2017-05-26 | null | 2016-12-18 |[null,2016-12-1812017-05-26]| |5678 | 2013-05-07 | 2018-05-12 |空|[空,2013-05-072018-05-12]| +--+-----+-----+-----+---------------+ 现在,您可以使用和的组合来循环cols中的每一列,并在排序数组中找到相应的索引

df=df.select 身份证件 *[ f、 结合 *[ f、 什么时候 f、 colsorted.getItemi==f.colc, f、 利蒂 因为我在兰格伦科尔 ] .别名c 对于c,在cols中 ] df.showtruncate=False +--+--+--+--+ |id | a | b | c| +--+--+--+--+ |2346 | 2 |空| 1| |5678 | 1 | 2 |空| +--+--+--+--+ 最后用0填充空值:

df=df.na.fill0 df.showtruncate=False +--+--+--+--+ |id | a | b | c| +--+--+--+--+ |2346|2 |0 |1 | |5678|1 |2 |0 | +--+--+--+--+
非常感谢。但是,在用0填充数据帧的空值之前,我遇到了不同的结果。排序时会考虑空值,因此结果不正确。例如,对于第一行,我得到a、b和c列的以下排名:3,null,2 pyspark的哪个版本?您确定null实际上缺少值而不是字符串null吗?这不应该发生,但一个快速解决方法是只减去1-即设为f.liti-1-但我怀疑这里发生了其他事情我再次检查,似乎没有空值,我没有值。在我从另一个源数据帧构建的输入数据帧中。当一个id在源数据框中没有列的值时,我在输入数据框中没有值。但多亏了你的快速修复,我成功地解决了这个小问题。而且,当你有两个相似的日期时,这些日期的排名是相同的,但下一个日期的排名是3,而不是2。代替序列1,1,2,我们得到序列1,1,3@johndoe43567是的,这就是领带的工作原理。如果您有不同的要求,请回答您的问题或询问更新问题的新问题。