使用 spark scala 向空数据框添加一行

Posted

技术标签:

【中文标题】使用 spark scala 向空数据框添加一行【英文标题】:Add a row to a empty dataframe using spark scala 【发布时间】:2019-03-26 23:35:07 【问题描述】:

我正在尝试使用 spark scala 将随机数据自动化并加载到空数据帧中

import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.Row
import org.apache.spark.rdd.RDD

val df = spark.sql("select * from test.test")
val emptyDF= spark.createDataFrame(spark.sparkContext.emptyRDD[Row], df.schema)

我在这里尝试使用测试表架构创建一个空数据框。在这种情况下,它是(id int,名称字符串)。 我正在尝试向此数据框添加一个空行。

val df2=Seq((1,2)).toDF("col1","col2")
emptyDF.union(df2)

但是如果我更改表名,我必须在 Seq(data) 和 toDF(columns) 中手动执行此操作,我想更改代码以便可以随机添加数据,并且模式应该从表中推断出来,比如下面的例子

val columninfo = "\""+emptyDF.columns.mkString("\",\"")+"\""
val columncount = emptyDF.columns.size
val x = (1 to columncount).toList.mkString(",")

var df1=Seq(x).toDF(columninfo)

但它不起作用,请让我知道是否有任何其他方法可以将随机数据附加到空数据帧或如何自动化上述操作,或者任何其他适合的方法。 提前致谢

【问题讨论】:

【参考方案1】:

您可以创建一个带有一条记录的虚拟 DataFrame(其值将被忽略),然后在该 DF 上使用 select 并将“空”DataFrame 的列作为列 names 并以整数作为列 values:

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

emptyDF.show()
// +----+----+
// |col1|col2|
// +----+----+
// +----+----+

List(1).toDF("dummy")
  .select(emptyDF.columns.zipWithIndex.map  case (name, value) => lit(value) as name : _*)
  .show()
// +----+----+
// |col1|col2|
// +----+----+
// |   0|   1|
// +----+----+

注意:这假定emptyDF 中的所有列都是Int 类型。如果无法支持该假设,您将需要一个更复杂的解决方案,它不仅使用emptyDf.columns(它们只是名称),而且映射到emptyDf.schema

关于你的尝试:

看起来您正在尝试使用代码编写代码...虽然这在技术上是可行的(请参阅:宏),但它几乎从来都不是正确的方法,而且它比只是将包含代码 sn-ps 的字符串参数作为方法的参数传递。 另外 - 你不需要 union - 使用空 DataFrame 执行 union 是没有意义的

【讨论】:

以上是关于使用 spark scala 向空数据框添加一行的主要内容,如果未能解决你的问题,请参考以下文章

R:向空数据框添加行时丢失列名

如何在 Scala/Spark 中为数据框中的每一行编写一个 Json 文件并重命名文件

将新行与spark scala中数据框中的前一行数据合并

如何使用 Scala/Spark 添加不基于数据框中现有列的新列? [复制]

如何为scala中的空数据框现有列添加赋值?

在 Spark Scala 中将一行从一个数据集添加到另一个数据集