gpt4 book ai didi

java - Spark 中的关系转换

转载 作者:行者123 更新时间:2023-12-01 20:18:19 26 4
gpt4 key购买 nike

我正在尝试使用 Spark DataSet 加载(比方说)人员的相当大的数据,其中子集数据如下所示。

|age|maritalStatus|    name|sex|
+---+-------------+--------+---+
| 35| M| Joanna| F|
| 25| S|Isabelle| F|
| 19| S| Andy| M|
| 70| M| Robert| M|
+---+-------------+--------+---+

我的需要是进行关系转换,其中一列从其他列派生其值。例如,根据每个人记录的“年龄”和“性别”,我需要将先生或女士/夫人放在每个“姓名”属性前面。另一个例子是,对于“年龄”超过60岁的人,我需要将他或她标记为老年人(派生列“seniorCitizen”为Y)。

我对转换后的数据的最终需求如下:

+---+-------------+---------------------------+---+
|age|maritalStatus| name|seniorCitizen|sex|
+---+-------------+---------------------------+---+
| 35| M| Mrs. Joanna| N| F|
| 25| S| Ms. Isabelle| N| F|
| 19| S| Mr. Andy| N| M|
| 70| M| Mr. Robert| Y| M|
+---+-------------+--------+------------------+---+

Spark 提供的大多数转换都是静态的而不是动态的。例如,如示例 here 中所定义和 here .

我使用 Spark 数据集是因为我从关系数据源加载,但如果您可以建议使用普通 RDD 来实现此目的的更好方法,请这样做。

最佳答案

您可以使用 withColumn 添加新列,用于使用 where 子句的 seniorCitizen 以及更新 name 您可以使用用户定义的函数(udf),如下所示

import spark.implicits._

import org.apache.spark.sql.functions._
//create a dummy data
val df = Seq((35, "M", "Joanna", "F"),
(25, "S", "Isabelle", "F"),
(19, "S", "Andy", "M"),
(70, "M", "Robert", "M")
).toDF("age", "maritalStatus", "name", "sex")

// create a udf to update name according to age and sex
val append = udf((name: String, maritalStatus:String, sex: String) => {
if (sex.equalsIgnoreCase("F") && maritalStatus.equalsIgnoreCase("M")) s"Mrs. ${name}"
else if (sex.equalsIgnoreCase("F")) s"Ms. ${name}"
else s"Mr. ${name}"
})

//add two new columns with using withColumn
df.withColumn("name", append($"name", $"maritalStatus", $"sex"))
.withColumn("seniorCitizen", when($"age" < 60, "N").otherwise("Y")).show

输出:

+---+-------------+------------+---+-------------+
|age|maritalStatus| name|sex|seniorCitizen|
+---+-------------+------------+---+-------------+
| 35| M| Mrs. Joanna| F| N|
| 25| S|Ms. Isabelle| F| N|
| 19| S| Mr. Andy| M| N|
| 70| M| Mr. Robert| M| Y|
+---+-------------+------------+---+-------------+

编辑:

这是不使用 UDF 的输出

df.withColumn("name",
when($"sex" === "F", when($"maritalStatus" === "M", concat(lit("Ms. "), df("name"))).otherwise(concat(lit("Ms. "), df("name"))))
.otherwise(concat(lit("Ms. "), df("name"))))
.withColumn("seniorCitizen", when($"age" < 60, "N").otherwise("Y"))

希望这有帮助!

关于java - Spark 中的关系转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45310769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com