将值转换为Spark数据集中的列(将键和值对列转换为常规列)

时间:2018-06-06 14:02:06

标签: java apache-spark apache-spark-sql pivot apache-spark-dataset

我有一个Dataframe(Java),它具有以下简单模式。这是一个示例实例:

+-------------------+
| id | key | Value  |
+-------------------+
| 01 | A   | John   |
| 01 | B   | Nick   |
| 02 | A   | Mary   |
| 02 | B   | Kathy  |
| 02 | C   | Sabrina|
| 03 | B   | George |
+-------------------+

我想将其转换为以下内容:

+------------------------------+
| id | A    | B      | C       |
+------------------------------+
| 01 | John | Nick   | null    |
| 02 | Mary | Kathy  | Sabrina |
| 03 | null | George | null    |
+------------------------------+

我尝试了pivot运算符(因为它实际上是这样)但部分工作,因为一旦值A B和C成为列,列的内容只能是数字。

Dataset<Row> pivotTest2 = pivotTest.groupBy(col("id")).pivot("key").count();

我真正想要的是,在计数的位置,放置列值的值,即.select(col("Value")),甚至.max("Value")形式的东西都可以正常工作,但是我不能,因为Value不是算术列。

1 个答案:

答案 0 :(得分:0)

执行以下操作应该适合您

import static org.apache.spark.sql.functions.*;

Dataset<Row> pivotTest2 = pivotTest.groupBy(col("id")).pivot("key").agg(first("Value"));
pivotTest2.show(false);

应该给你

+---+----+------+-------+
|id |A   |B     |C      |
+---+----+------+-------+
|01 |John|Nick  |null   |
|03 |null|George|null   |
|02 |Mary|Kathy |Sabrina|
+---+----+------+-------+