首页 > 解决方案 > Spark SQL仅映射一列DataFrame

问题描述

抱歉这个菜鸟问题,我在 SparkSQL 中有一个这样的数据框:

id | name | data
----------------
1  | Mary | ABCD
2  | Joey | DOGE
3  | Lane | POOP
4  | Jack | MEGA
5  | Lynn | ARGH

我想知道如何做两件事:

1) 在一个或多个列上使用 scala 函数来生成另一列 2) 在一个或多个列上使用 scala 函数来替换一列

例子:

1) 创建一个新的布尔列,告诉数据是否以 A 开头:

id | name | data | startsWithA
------------------------------
1  | Mary | ABCD |        true
2  | Joey | DOGE |       false
3  | Lane | POOP |       false
4  | Jack | MEGA |       false
5  | Lynn | ARGH |        true

2)用小写对应替换数据列:

id | name | data
----------------
1  | Mary | abcd
2  | Joey | doge
3  | Lane | poop
4  | Jack | mega
5  | Lynn | argh

在 SparkSQL 中执行此操作的最佳方法是什么?我已经看到了很多关于如何返回单个转换列的示例,但我不知道如何返回包含所有原始列的新 DataFrame。

标签: scalaapache-sparkdataframeapache-spark-sql

解决方案


您可以使用withColumn添加新column列或将现有列替换为

val df = Seq(
 (1, "Mary", "ABCD"),
 (2, "Joey", "DOGE"),
 (3, "Lane", "POOP"),
 (4, "Jack", "MEGA"),
 (5, "Lynn", "ARGH")
).toDF("id", "name", "data")


val resultDF = df.withColumn("startsWithA", $"data".startsWith("A"))
  .withColumn("data", lower($"data"))

如果你想要单独的数据框,那么

val resultDF1 = df.withColumn("startsWithA", $"data".startsWith("A"))
val resultDF2 = df.withColumn("data", lower($"data"))

withColumncolumn如果提供了相同的名称,则替换旧名称,如果提供新名称column,则创建一个新名称。输出:columncolumn

+---+----+----+-----------+
|id |name|data|startsWithA|
+---+----+----+-----------+
|1  |Mary|abcd|true       |
|2  |Joey|doge|false      |
|3  |Lane|poop|false      |
|4  |Jack|mega|false      |
|5  |Lynn|argh|true       |
+---+----+----+-----------+

推荐阅读