繁体   English   中英

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

[英]Add a row to a empty dataframe using spark scala

我正在尝试使用 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)

在这里,我试图创建一个带有 test table schema 的空数据框。 在这种情况下,它是 (id int, name string)。 我正在尝试向此数据框添加一个空行。

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)

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

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

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是没有意义的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM