将值转换为 Spark 数据集中的列(将列的键和值对转换为常规列)[重复]
Posted
技术标签:
【中文标题】将值转换为 Spark 数据集中的列(将列的键和值对转换为常规列)[重复]【英文标题】:Converting Values to Columns in Spark Dataset (Convert Key & Value pair of columns to regular columns) [duplicate] 【发布时间】:2018-11-16 06:09:36 【问题描述】:我有一个具有以下简单架构的 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 |
+------------------------------+
我尝试了枢轴运算符(因为它实际上是这样)但部分工作是因为一旦值 A B 和 C 成为列,列的内容只能是数字。
Dataset<Row> pivotTest2 = pivotTest.groupBy(col("id")).pivot("key").count();
我真正想要的是代替计数,将列 Value 的值,即.select(col("Value"))
,甚至.max("Value")
形式的东西都可以正常工作,但我不能因为@ 987654326@ 不是算术列。
【问题讨论】:
你需要first
而不是max
或count
【参考方案1】:
执行以下操作应该对您有用
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|
+---+----+------+-------+
【讨论】:
以上是关于将值转换为 Spark 数据集中的列(将列的键和值对转换为常规列)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
删除 NSDictionaries 中超过 100.000 公里的键和值