我想使用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中有没有办法进行这种类型的旋转?
答案 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}]