Spark SQL仅映射一列DataFrame
Posted
技术标签:
【中文标题】Spark SQL仅映射一列DataFrame【英文标题】:Spark SQL Map only one column of DataFrame 【发布时间】:2018-05-08 16:30:35 【问题描述】:抱歉这个菜鸟问题,我在 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。
【问题讨论】:
您可以使用withColumn
添加列并保留现有列。例如,请参阅this post。如果您使用与现有列相同的名称,它将覆盖它。
在 pyspark 中,您可以通过:from pyspark.sql.functions import col, lower; df = df.withColumn('startsWithA', col('data').startswith('A')).withColumn('data', lower(col('data')))
执行此操作。应该可以直接翻译成 scala。
@pault 谢谢,但是您知道如何使用它来替换某个列吗?假设我想将我的大写数据转换为小写,如示例 2 所示。
或者你可以使用 spark-sql,比如:"SELECT id, name, LOWER(data) AS data, data LIKE 'A%' AS startsWithA FROM myTable"
【参考方案1】:
您可以使用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 |
+---+----+----+-----------+
【讨论】:
以上是关于Spark SQL仅映射一列DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
如何解决“不能使用 null 作为映射键!”使用 Group_Map 在 Python 3 中出现 Spark.SQL 错误