使用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()