使用scala在Spark数据框中添加新行

使用scala在Spark数据框中添加新行,scala,dataframe,apache-spark,Scala,Dataframe,Apache Spark,我有一个数据帧,如: Name_Index City_Index 2.0 1.0 0.0 2.0 1.0 0.0 我有一个新的值列表 list(1.0,1.0) 我想将这些值添加到dataframe中的新行,以防删除所有以前的行 我的代码: val spark = SparkSession.builder .master("local[*]") .config("spark.serializer", "o

我有一个数据帧,如:

Name_Index  City_Index
  2.0         1.0
  0.0         2.0
  1.0         0.0
我有一个新的值列表

list(1.0,1.0)
我想将这些值添加到dataframe中的新行,以防删除所有以前的行

我的代码:

 val spark = SparkSession.builder
      .master("local[*]")
      .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
      .getOrCreate()


    var data = spark.read.option("header", "true")
      .option("inferSchema", "true")
      .csv("src/main/resources/student.csv")

   val someDF = Seq(
         (1.0,1.0)
        ).toDF("Name_Index","City_Index")

   data=data.union(someDF).show()
它显示如下输出:

Name_Index  City_Index
  2.0          1.0
  0.0          2.0
  1.0          0.0
  1.1          1.1
但是输出应该是这样的。以便删除所有先前的行并添加新值

Name_Index   City_Index
  1.0          1.0

将最后一行更改为

data=data.except(data).union(someDF).show()

您可以使用limit&union函数来实现这一点。检查下面

scala> val df = Seq((2.0,1.0),(0.0,2.0),(1.0,0.0)).toDF("name_index","city_index")
df: org.apache.spark.sql.DataFrame = [name_index: double, city_index: double]

scala> df.show(false)
+----------+----------+
|name_index|city_index|
+----------+----------+
|2.0       |1.0       |
|0.0       |2.0       |
|1.0       |0.0       |
+----------+----------+


scala> val ndf = Seq((1.0,1.0)).toDF("name_index","city_index")
ndf: org.apache.spark.sql.DataFrame = [name_index: double, city_index: double]

scala> ndf.show
+----------+----------+
|name_index|city_index|
+----------+----------+
|       1.0|       1.0|
+----------+----------+


scala> df.limit(0).union(ndf).show(false) // this is not good approach., you can directly call ndf.show
+----------+----------+
|name_index|city_index|
+----------+----------+
|1.0       |1.0       |
+----------+----------+


你可以试试这种方法

data = data.filter(_ => false).union(someDF)
输出

+----------+----------+
|Name_Index|City_Index|
+----------+----------+
|1.0       |1.0       |
+----------+----------+
我希望它能给你一些启示


关于。

据我所知,您只需要源数据帧中的列列表

如果序列的列顺序与源数据帧的列顺序相同,则可以重用模式,而无需实际查询源数据帧。性能方面,它将更快

    val srcDf = Seq((2.0,1.0),(0.0,2.0),(1.0,0.0)).toDF("name_index","city_index")

    val dstDf = Seq((1.0, 1.0)).toDF(srcDf.columns:_*)


是否要删除所有以前的行&仅将新行添加到数据帧?是的。我要删除所有以前的行。如果要从初始数据帧中删除所有以前的行,为什么不直接调用newRow.toDFNo。我只想将这些值添加到旧的数据帧中。但也要删除前面的所有行。您可以直接调用第二个数据帧,或者如果仍要同时使用这两个数据帧,请尝试使用-data.limit(0).union(someDF).show(false)
data=data.limit(0).union(someDF).show()
。这也有同样的影响。data.limit(0)。union(someDF.show()比except方法..:)更快,如果您有数百万条记录,请检查性能。这需要时间。是的,这不是一个好方法。但我有一个这样的问题。这就是为什么。顺便说一下,非常感谢。这个看起来很有用。但是我有一个有效的解决方案
data=data.limit(0).union(someDF).show()