Apache spark 如何使用sql查询而不是api覆盖列

Apache spark 如何使用sql查询而不是api覆盖列,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,例如,我有一个表customers,其中有一列name和一列last\u name 我想连接这两列,并用连接的结果覆盖列name 在Spark sql api中,我们可以执行以下操作: customers.withColumn(“name”)、concat(col(“name”)、lit(“”)、col(“last_name”)) 在sql查询中执行以下操作: 选择*,concat(name,”,last_name)作为客户的姓名 将在数据框中添加另一个列名。因此,在末尾有两个同名的列nam

例如,我有一个表customers,其中有一列
name
和一列
last\u name

我想连接这两列,并用连接的结果覆盖列
name

在Spark sql api中,我们可以执行以下操作:

customers.withColumn(“name”)、concat(col(“name”)、lit(“”)、col(“last_name”))
在sql查询中执行以下操作:

选择*,concat(name,”,last_name)作为客户的姓名
将在数据框中添加另一个列名。因此,在末尾有两个同名的列
name

sql查询中是否有一种方法可以覆盖现有列而不添加新列?

这两种方法都有效

使用SQL方法是可行的。不要使用包含旧列的
*
,只需执行
CONCAT
,并使用
重命名为

customers.createOrReplaceTempView(“客户”)
sql(“选择CONCAT(name,,,last_name)作为来自客户的名称”).show()
//+--------+
//|名字|
//+--------+
//|无名氏|
//|无名氏|
//+--------+
withColumn
也可以工作,类似的还有一个

因此,按照您的意愿执行操作,创建一个新列,然后删除原始列并重命名新列

//问题设置
val客户==序号((“约翰”、“多伊”)、(“简”、“多伊”)。toDF(“姓名”、“姓氏”)
customers.show()
//+----+---------+
//|姓名|
//+----+---------+
//|约翰·多伊|
//|简·多伊|
//+----+---------+
导入org.apache.spark.sql.functions.{lit,col,concat}
“客户”栏(
“姓名”,concat(col(“姓名”),lit(“”),col(“姓氏”))
).drop(“name”、“last_name”).withcolumn重命名(“name”、“last_name”、“name”).show()
//+--------+
//|名字|
//+--------+
//|无名氏|
//|无名氏|
//+--------+
当然,您可以继续在
withColumn
函数调用中自己执行操作,为新生成的列添加标签
name
,以替换旧列,但您仍然需要删除
last\u name

customers.withColumn(
“名称”,concat(col(“名称”),lit(“”),col(“姓氏”)
).drop(“姓氏”).show()
//+--------+
//|名字|
//+--------+
//|无名氏|
//|无名氏|
//+--------+

不,您不能使用SQL来实现这一点。您必须明确指定select子句中的每一列。@Blackishop当然可以。他只需要停止使用
*
,它
选择
就可以了。看看我的答案。