Apache Spark:迭代数据帧行并通过 MutableList (Scala) 创建新数据帧

Posted

技术标签:

【中文标题】Apache Spark:迭代数据帧行并通过 MutableList (Scala) 创建新数据帧【英文标题】:Apache Spark: Iterate rows of dataframe and create new dataframe through MutableList (Scala) 【发布时间】:2019-02-27 12:56:30 【问题描述】:

我目前正在尝试学习在 Scala 中使用 Apache Spark。

我有下表作为我想用于分析的数据框

现在我想遍历行,获取正文列中字符串的 id 和字数,并在 2 列的数据框中输出信息。

def analyseDF(df:DataFrame): Unit = 
      //var retFrame = spark.emptyDataset[ClassIdCount].toDF()
      var tList = mutable.MutableList[IdCount]()

      df.foreach(row => 
        val wordCnt = row.getString(5).split(" ").size
        val mailid = row.getString(0)

        val record = IdCount(mailid.toString(), wordCnt.toInt)
        tList += record

        println(tList)
        println(record)

      )
      tList.toDF().show()
     // tList.toDS().show()

    

不知何故,在调用 tList.toDF().show() 时,具有 2 列的框架始终为空,但循环中的记录生成正确。任何人都可以在这里给我一个提示吗?

【问题讨论】:

【参考方案1】:

典型的初学者错误:tList 仅存在于驱动程序中,无法从执行程序端代码更新。这不是从现有数据框创建数据框的方式。请改用转换/聚合。

在您的情况下,您可以使用内置 Dataframe API 函数 splitsize

import org.apache.spark.sql.functions._

val transformedDf = df
  .select(
      $"id",
      size(split($"body"," "))).as("cnt")
  )

【讨论】:

以上是关于Apache Spark:迭代数据帧行并通过 MutableList (Scala) 创建新数据帧的主要内容,如果未能解决你的问题,请参考以下文章

Spark中具有固定向量的数据帧行的点积

基于其他列(即应用 CDC)将多个 spark 数据帧行组合成一个

将 spark 数据帧行写入 dynamoDB 表中的项目

如何将 Content-Type: application/x-www-form-urlencoded 格式的数据帧行迭代到 API POST 请求中?

Pyspark 将 json 数组转换为数据帧行

在 Apache Spark 中为每行迭代添加范围变量