PySpark Pivoting

时间:2017-10-29 18:54:32

标签: python apache-spark pyspark pivot

我想使用PySpark来转移来自多个表的数据,但我需要以一种奇怪的方式进行。请参阅下面的示例。

原始表:

Vehicle_id | Owner_ID    | Vehicle_Buy_Date
--------------------------------------------
1          | 1           | 01/01/2015
1          | 2           | 01/10/2014
2          | 1           | 10/10/2016

最终结果:

Vehicle_id | Owner_1_Buy_Date | Owner_2_Buy_Date
------------------------------------------------
1          |01/01/2015        |01/10/2014
2          |10/10/2016        |NULL

我理解这是一个不寻常的问题,因为这不是主要在数据库表上完成的。

在PySpark中有没有办法进行这种类型的旋转?

3 个答案:

答案 0 :(得分:1)

pyspark中的函数称为pivot

import pyspark.sql.functions as psf
df.groupBy("Vehicle_id").pivot("Owner_ID").agg(psf.max("Vehicle_Buy_Date")).show()

    +----------+----------+----------+
    |Vehicle_id|         1|         2|
    +----------+----------+----------+
    |         1|01/01/2015|01/10/2014|
    |         2|10/10/2016|      null|
    +----------+----------+----------+

如果您知道不同Owner_ID的数量,可以在pivot函数中将其指定为列表参数,否则它将自行计算。

答案 1 :(得分:1)

尝试使用此代码来获得所需的结果:

NewDf = df.withColumn('id', F.concat(F.lit('Owner_'), F.col('owner_id'), F.lit('_Buy_Date')).groupBy('Vehicle_id').pivot('id').agg(F.first('Vehicle_Buy_Date'))

答案 2 :(得分:0)

转换数据不是一个好主意,将public class ClassToTest1 { private ClassToTest2 c2; public ClassToTest2 getC2() { if (c2 == null) { c2 = new ClassToTest2(); }; return c2; } public void setC2(ClassToTest2 c2) { this.c2 = c2; } public void somethingToTestVoid() throws Exception { getC2().doSomething(); System.out.println("OK!"); } } public class ClassToTest2 { public ClassToTest2() { } public void doSomething() throws Exception { throw new Exception(""); } } @Test public void test1() throws Exception { ClassToTest1 c1 = new ClassToTest1(); c1 = Mockito.spy(c1); ClassToTest2 c2 = Mockito.spy(new ClassToTest2()); Mockito.doReturn(c2).when(c1).getC2(); Mockito.doNothing().when(c2).doSomething(); c1.somethingToTestVoid(); } 数据轻松地转换为这样的结构(我这是一种更好的方式):

reduce

yoy如何转置这样的结构?

Vehicle_id | Owner_ID_Vehicle_Buy_Date_Reduce
--------------------------------------------
1          | [{"Owner_ID":1, Vehicle_Buy_Date: 01/01/2015},{ "Owner_ID": 2,   Vehicle_Buy_Date: 01/10/2014}]
2          | [{"Owner_ID":1, Vehicle_Buy_Date: 10/10/2016}]