在 Spark-Scala 中将单个字符串列拆分为多列

Posted

技术标签:

【中文标题】在 Spark-Scala 中将单个字符串列拆分为多列【英文标题】:Split single String column to multiple columns in Spark-Scala 【发布时间】:2020-11-18 13:55:45 【问题描述】:

我有一个数据框:

+----+--------------------------+
|city|Types                     |
+----+--------------------------+
|BNG |school                    |
|HYD |school,restaurant         |
|MUM |school,restaurant,hospital|
+----+--------------------------+

我想用 ','Types 列拆分为多个列。

问题是列大小没有固定,所以我不知道该怎么做。

我在 pyspark 中看到了另一个相关问题,但我想在 spark-scala 中而不是 pyspark 中解决

感谢任何帮助。

提前致谢

【问题讨论】:

在类型长度不​​固定的情况下,确定要将Types列拆分为多列吗?因为这样,所需输出数据帧中的许多字段将是null。为相同的city 拥有与Types 列中的类型一样多的记录不是更好吗?或者甚至更好的带有键值对的 RDD? 只使用一个数组作为列。 【参考方案1】:

解决列中不规则大小的一种方法是调整表示。

例如:

val data = Seq(("BNG", "school"),("HYD", "school,res"),("MUM", "school,res,hos")).toDF("city","types")

+----+--------------+
|city|         types|
+----+--------------+
| BNG|        school|
| HYD|    school,res|
| MUM|school,res,hos|
+----+--------------+

data.withColumn("isSchool", array_contains(split(col("types"),","), "school")).withColumn("isRes", array_contains(split(col("types"),","), "res")).withColumn("isHos", array_contains(split(col("types"),","), "hos"))

+----+--------------+--------+-----+-----+
|city|         types|isSchool|isRes|isHos|
+----+--------------+--------+-----+-----+
| BNG|        school|    true|false|false|
| HYD|    school,res|    true| true|false|
| MUM|school,res,hos|    true| true| true|
+----+--------------+--------+-----+-----+

【讨论】:

以上是关于在 Spark-Scala 中将单个字符串列拆分为多列的主要内容,如果未能解决你的问题,请参考以下文章

R语言将dataframe的某个字符串列拆分为多列实战

将字符串列拆分为几个虚拟变量

如何在pyspark中将字符串列转换为ArrayType

python 将字符串列拆分为两列

JPA - 如何在 DDL 中将字符串列设置为 varchar(max)

将 Spark Dataframe 字符串列拆分为多列