将值转换为 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 而不是maxcount 【参考方案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 公里的键和值

将字典的键和值从“unicode”转换为“str”的最快方法?

python pandas数据框列转换为dict键和值

高效地将 JavaScript 键和值数组转换为对象

获取以索引为导向的嵌套字典中的键和值列表

获取 Apache spark 数据集中包含的列的列数据类型