如何将行旋转到列并收集Spark中按键分组的第一个非空值

时间:2019-05-24 23:47:49

标签: scala apache-spark apache-spark-sql

我想按时间戳对一组时间序列数据进行分组,其中给定组中的每一行都包含一个名为“名称”的列,然后将这些名称转换为列,并使用每个列的第一个非空值生成一行名称作为该列的值。

例如,给定这样的DataFrame:

+-----+---------+---------+
| ts  | name    | value   |
+-----+---------+---------+
| 1   | "temp"  | "72"    |
+-----+---------+---------+
| 1   | "humid" | "30"    |
+-----+---------+---------+
| 1   | "fan"   | "50%"   |
+-----+---------+---------+
| 2   | "temp"  | "70"    |
+-----+---------+---------+
| 2   | "humid" | "40"    |
+-----+---------+---------+
| 2   | "fan"   | "30%"   |
+-----+---------+---------+
| 3   | "temp"  | "68"    |
+-----+---------+---------+
| 3   | "humid" | "50"    |
+-----+---------+---------+
| 3   | "fan"   | "20%"   |
+-----+---------+---------+

我想要这个结果:

+-----+---------+--------+--------+
| ts  | temp    | humid  | fan    |
+-----+---------+--------+--------+
| 1   | "72"    | "30"   | "50%"  |
+-----+---------+--------+--------+
| 2   | "70"    | "40"   | "30%"  |
+-----+---------+--------+--------+
| 3   | "68"    | "50"   | "20%"  |
+-----+---------+--------+--------+

我显然可以绕过名称,这导致每个名称/值对有一行,但是后来我没有“折叠”这些行以消除空值,并且没有一个行可以关联给定时间戳记的所有值一起。我尝试了.pivot("name").agg(first("value", true)),但是没有用。

0 个答案:

没有答案