Spark SQL Map只有一列DataFrame

时间:2018-05-08 16:30:35

标签: scala apache-spark dataframe apache-spark-sql

对于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。

1 个答案:

答案 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       |
+---+----+----+-----------+