我正在尝试使用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)
但是它不起作用,请让我知道是否还有其他方法可以将随机数据追加到空数据帧或如何自动执行上述操作,或者其他任何合适的方法。 预先感谢
答案 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
。
关于您的尝试:
union
-用空的DataFrame执行union
是没有意义的