对于noob问题,很抱歉,我在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。
答案 0 :(得分:2)
您可以使用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"))
如果提供了相同的withColumn
名称,则 column
会替换旧的column
,如果提供了新的column
名称,则会创建新的column
。
输出:
+---+----+----+-----------+
|id |name|data|startsWithA|
+---+----+----+-----------+
|1 |Mary|abcd|true |
|2 |Joey|doge|false |
|3 |Lane|poop|false |
|4 |Jack|mega|false |
|5 |Lynn|argh|true |
+---+----+----+-----------+