scala - 如何使用scala将Spark DataFrame中的每一行分成多行

标签 scala dataframe

我有一个包含如下数据的数据框

Key  Today  MTD  QTD  HTD  YTD 
K1   10     20   10   20   50
K2   20     30   20   10   60

我正在寻找类似的输出

Key  PRD     Amt
K1   Today   10
K1   MTD     20
K1   QTD     10
K1   HTD     20
K1   YTD     50

我尝试使用 Pivot,但它提供了其他方式。我不确定我是否可以使用平面 map 或 map ?请指教。

最佳答案

import org.apache.spark.sql._
import spark.implicits._

val list = List(("K1", 10, 20, 10, 20,50), ("K2", 20, 30, 20, 10, 60))
val yourDF = sc.parallelize(list).toDF("Key", "Today", "MTD", "QTD", "HTD", "YTD")

// yourDF.show()
// +---+-----+---+---+---+---+
// |Key|Today|MTD|QTD|HTD|YTD|
// +---+-----+---+---+---+---+
// | K1|   10| 20| 10| 20| 50|
// | K2|   20| 30| 20| 10| 60|
// +---+-----+---+---+---+---+

val newDataFrame = yourDF
  .rdd
  .flatMap(row => {
    val key = row.getString(0)
    val todayAmt = row.getInt(1)
    val mtdAmt = row.getInt(2)
    val qtdAmt = row.getInt(3)
    val htdAmt = row.getInt(4)
    val ytdAmt = row.getInt(5)

    List(
      (key, "today", todayAmt),
      (key, "MTD", mtdAmt),
      (key, "QTD", qtdAmt),
      (key, "HTD", htdAmt),
      (key, "YTD", ytdAmt)
    )
  })
  .toDF("Key", "PRD", "Amt" )

// newDataFrame.show()
// +---+-----+---+
// |Key|  PRD|Amt|
// +---+-----+---+
// | K1|today| 10|
// | K1|  MTD| 20|
// | K1|  QTD| 10|
// | K1|  HTD| 20|
// | K1|  YTD| 50|
// | K2|today| 20|
// | K2|  MTD| 30|
// | K2|  QTD| 20|
// | K2|  HTD| 10|
// | K2|  YTD| 60|
// +---+-----+---+

关于scala - 如何使用scala将Spark DataFrame中的每一行分成多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39042420/

相关文章:

multithreading - Await.result还是一个简单的电话?

scala - Akka Ask 与定时重试

image - 单色位图

scala - bigquery 在数组外添加重复记录

Python:如何在两列之间的 Pandas 数据框中添加一列?

r - 从具有 R 标准格式日期/时间的大型数据集中计算平均每日值?

python - Pandas 计算具有列表而不是单个值的列的平均值

mongodb - 带 SSL 的 ReactiveMongo

python - 如何在 python 中使用分组进行聚合

python - 在 R/Python 中分析巨大的 csv 文件并根据文件的分布抽样 X%?