如何使用scala数据框添加具有以下行值的新列[重复]
Posted
技术标签:
【中文标题】如何使用scala数据框添加具有以下行值的新列[重复]【英文标题】:how to add a new column having the value of the following line with scala dataframe [duplicate] 【发布时间】:2020-02-27 00:17:32 【问题描述】:我有一个数据框
+----------+----------+
| longitude| latitude|
+----------+----------+
|-7.1732833|32.0414966|
|-7.1732844|32.0414406|
|-7.1732833|32.0414966|
|-7.1732833|32.0414966|
|-7.1732833|32.0414966|
|-7.1732833|32.0414966|
预期结果
+----------+----------+-----------------+----------------------+----------------+-------------+
| longitude| latitude| origin_longitude |destination_longitude|origine_latitude|destination_latitude
+----------+----------+ -----------------+---------------------+----------------+
|-7.1732833|32.0414966|-7.1732833 |-7.1732844 |32.0414966 |32.0414406
|-7.1732844|32.0414406|-7.1732844 |-7.1732833 |32.0414406 |32.0414966
|-7.1732833|32.0414966|-7.1732833 |-7.1732833 |32.0414966 |32.0414966
|-7.1732833|32.0414966|-7.1732833 |-7.1732833 |32.0414966 |32.0414966
|-7.1732833|32.0414966|-7.1732833 |-7.1732833 |32.0414966 |32.0414966
|-7.1732833|32.0414966|
我怎么能用 scala 做到这一点,我是 scala 的新手,请帮忙。 谢谢。
【问题讨论】:
这能回答你的问题吗? Append a column to Data Frame in Apache Spark 1.3 【参考方案1】:您可以使用窗口函数来获取下一个(前导)行并创建一个新列,但是,前导要求我们使用 orderBy,如果我要在纬度/经度上进行 orderBy,则不会保留您的数据框顺序,因此,我手动创建了一个 seq 列,以保留您的订单。在您的真实数据中,您应该有一列可以帮助您订购。
%scala
val df=Seq(
(1,-7.1732833,32.0414966),
(2,-7.1732844,32.0414406),
(3,-7.1732833,32.0414966),
(4,-7.1732833,32.0414966),
(5,-7.1732833,32.0414966),
(6,-7.1732833,32.0414966)
).toDF("seq","longitude","latitude")
df.show()
+---+----------+----------+
|seq| longitude| latitude|
+---+----------+----------+
| 1|-7.1732833|32.0414966|
| 2|-7.1732844|32.0414406|
| 3|-7.1732833|32.0414966|
| 4|-7.1732833|32.0414966|
| 5|-7.1732833|32.0414966|
| 6|-7.1732833|32.0414966|
+---+----------+----------+
import org.apache.spark.sql.functions.lead
import org.apache.spark.sql.functions.col
val w = org.apache.spark.sql.expressions.Window.orderBy("date").orderBy("seq")
df.withColumn("destination_longitude", lead("longitude",1,0).over(w)).withColumn("destination_latitude", lead("latitude",1,0).over(w)).select(col("longitude").alias("origin_longitude"),col("destination_longitude"),col("latitude").alias("origin_latitude"),col("destination_latitude")).filter(col("destination_longitude")!==0.0).show()
+----------------+---------------------+---------------+--------------------+
|origin_longitude|destination_longitude|origin_latitude|destination_latitude|
+----------------+---------------------+---------------+--------------------+
| -7.1732833| -7.1732844| 32.0414966| 32.0414406|
| -7.1732844| -7.1732833| 32.0414406| 32.0414966|
| -7.1732833| -7.1732833| 32.0414966| 32.0414966|
| -7.1732833| -7.1732833| 32.0414966| 32.0414966|
| -7.1732833| -7.1732833| 32.0414966| 32.0414966|
+----------------+---------------------+---------------+--------------------+
【讨论】:
非常感谢,但是当我尝试这样做时,我得到了这个错误:错误:(25, 333) value !== is not a member of org.apache.spark.sql.Column scala.任何想法! 非常感谢您的回复,它对我有用。【参考方案2】:您可以使用df.withColumn("origin_longitude",lit(-7.1732833))
,您可以根据需要链接任意数量的withColumn
函数。
【讨论】:
问题不在于withColumn,而在于如何将下一行的值放入该行。以上是关于如何使用scala数据框添加具有以下行值的新列[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Scala/Spark 添加不基于数据框中现有列的新列? [复制]