如何解决如何使用sql查询而非api
例如,我有一个表客户,其中有一个列name
和一个列last_name
。
我想将这两列连接起来,并用连接的结果覆盖列name
。
在Spark sql API中,我们可以执行something like:
customers.withColumn("name",concat(col("name"),lit(" "),col("last_name")))
在sql查询中执行以下操作:
select *,concat(name," ",last_name) AS name from customers
将改为在数据框中添加另一个列名称。因此,最后有两列具有相同名称name
。
sql查询中是否有一种方法可以覆盖现有列而不添加新列?
解决方法
两种方法都可以。
使用SQL方法有效。不要使用*
,它会包含旧的列,只需执行CONCAT
并用AS
重命名即可。
customers.createOrReplaceTempView("customers")
spark.sql("SELECT CONCAT(name,' ',last_name) AS name FROM customers").show()
//+--------+
//| name|
//+--------+
//|John Doe|
//|Jane Doe|
//+--------+
withColumn
也可以,并且类似地有一个withColumnRenamed
。
因此,请根据需要执行操作,创建一个新列,然后删除原始列并重命名新列。
// Problem Setup
val customers = = Seq(("John","Doe"),("Jane","Doe")).toDF("name","last_name")
customers.show()
//+----+---------+
//|name|last_name|
//+----+---------+
//|John| Doe|
//|Jane| Doe|
//+----+---------+
import org.apache.spark.sql.functions.{lit,col,concat}
customers.withColumn(
"name_last_name",concat(col("name"),lit(" "),col("last_name"))
).drop("name","last_name").withColumnRenamed("name_last_name","name").show()
//+--------+
//| name|
//+--------+
//|John Doe|
//|Jane Doe|
//+--------+
当然,您可以继续进行withColumn
函数调用中的操作,为新生成的列添加标签name
代替旧的列,但是您仍然必须删除{ {1}}。
last_name
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。