【问题标题】:How to convert dataframe rows values to dynamic columns?如何将数据框行值转换为动态列?
【发布时间】:2018-12-17 20:11:39
【问题描述】:

我有一个dataFrame,如下所示

-----------------------------
|  A   |   B       |   C    |  
-----------------------------
|  1   |  col_1   |   val1   |  
|  1   |  col_2   |   val2   |  
|  1   |  col_3   |   val3   |  
|  1   |  col_4   |   val4   |  
-----------------------------

我需要将其转换如下

-----------------------------------------------
|  A   |  col_1  |   col_2  |   col_3 | col_4 |
-----------------------------------------------
|  1   |  val1   |  val2    |  val3  |  val4  |
-----------------------------------------------

如何使用 scala + spark-sql 做到这一点?任何线索都非常感谢。

【问题讨论】:

  • How to pivot DataFrame?的可能重复
  • @SCouto 谢谢先生,让我检查一下,先生如何格式化我的问题,我应该使用任何插件或工具进行编辑吗?我在哪里可以找到更多信息?
  • StackOverflow 有一个格式化程序,您的编辑面板中有一些按钮可以将您的问题部分格式化为代码、引号等。
  • @SCouto 谢谢。

标签: scala apache-spark-sql databricks


【解决方案1】:

一个 groupBy 和一个 agg 子句就足够了:

df.groupBy("A").pivot("B").agg(first("C"))

首先使用 groupBy 对可能的值进行分组,然后根据键列(在您的情况下为 B)进行旋转并获取值 (C)

输入

df.show
+---+-----+----+
|  A|    B|   C|
+---+-----+----+
|  1|col_1|val1|
|  1|col_2|val2|
|  1|col_3|val3|
|  1|col_4|val4|
+---+-----+----+

输出

+---+-----+-----+-----+-----+
|  A|col_1|col_2|col_3|col_4|
+---+-----+-----+-----+-----+
|  1| val1| val2| val3| val4|
+---+-----+-----+-----+-----+

【讨论】:

  • 谢谢,我查一下,你这里为什么先用.agg(first("C"))?
  • 因为您需要,在您的情况下,首先需要一个聚合函数(sum,max,min),因为每个组都有一个值,所以它将采用第一个(唯一)元素。
  • 有效,先生,非常感谢,抱歉耽搁了,先生有两个小问题,枢轴列是大写,整数,需要将它们转换为小写,6精度的doube如何动态执行???如果 C 列值为 null 或 0 ,我需要取 D 列值...如何实现?假设原始数据框中还有另一列 D。
  • 先生,我得到了 lower() 函数来转换,但是如何做剩下的两个?即将数据透视列数据类型从整数更改为 double 并且如果 C 列值为 null 或 0 ,我需要采用 D 列值吗?
  • 第一个只是一个地图。对于第二个 hoy 可以使用 org.apache.spark.sql.functions 包中的 when 运算符。我认为您应该打开一个新问题,并为最后一个问题提供适当的示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2015-01-19
  • 1970-01-01
  • 2020-01-03
  • 2017-04-01
  • 1970-01-01
  • 2018-02-04
相关资源
最近更新 更多