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 错误

Spark SQL一列拆分多列

Tableau + Spark SQL 连接器 + Java Spark 数据帧

spark sql 判断一列是否包含某字符

针对主表一列 spark.sql 验证 2 列中的数据

如何优化大数据框上的 spark sql 操作?