【问题标题】:Add a row to a empty dataframe using spark scala使用 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)

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

【问题讨论】:

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


    【解决方案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 是没有意义的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 2018-06-15
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      相关资源
      最近更新 更多