使用Spark Scala将行添加到空数据框

时间:2018-10-22 20:07:58

标签: scala apache-spark dataframe apache-spark-sql

我正在尝试使用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 个答案:

答案 0 :(得分:1)

您可以创建一个具有一个记录(其值将被忽略)的虚拟DataFrame,而只需在该DF上使用select,并将“ empty” DataFrame的列用作 names < / em>并使用整数作为列 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

关于您的尝试:

  • 您似乎正在尝试使用代码编写代码 ......虽然这在技术上是可行的(请参阅:宏),但这几乎不是正确的方法,而且涉及的范围比只是将包含代码片段的String参数传递为方法的参数。
  • 此外-您不需要union-用空的DataFrame执行union是没有意义的