如何使用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 添加不基于数据框中现有列的新列? [复制]

使用 ifelse 添加具有条件值的新列

如何将具有值的新列添加到现有数据表?

Python如何在pandas数据框中提取[]括号内的指定字符串并创建一个具有布尔值的新列

如何在遍历熊猫数据框时创建新列并插入行值

Python - 从包含值列表的字典中添加具有映射值的新列