apache-spark - 如何在第一次出现字符串时拆分列?
问题描述
我有一个以下格式的数据框。我想拆分“。”之前的单词。在用户名列中并将其余部分保留为不同的列
+----+--------+
|Name|Username|
+----+--------+
| ABC|a.b.cdef|
+----+--------+
我想将用户名拆分为
+----+--------+---+------+
|Name|Username| A| B|
+----+--------+---+------+
| ABC|a.b.cdef| a|b.cdef|
+----+--------+---+------+
前缀的长度(第一个之前.
)不固定,因此我不能使用substring
标准函数。
解决方案
对于这种特殊情况,我会(重新)考虑一个用户定义的函数(并避免使用正则表达式,因为几周后可能很难理解)。
val splitFirst = udf { (s: String) => s.split("\\.", 2) }
scala> data.withColumn("AB", splitFirst($"username")).show
+----+--------+-----------+
|Name|Username| AB|
+----+--------+-----------+
| ABC|a.b.cdef|[a, b.cdef]|
+----+--------+-----------+
val solution = data
.withColumn("AB", splitFirst($"username"))
.withColumn("A", $"AB"(0))
.withColumn("B", $"AB"(1))
scala> solution.show
+----+--------+-----------+---+------+
|Name|Username| AB| A| B|
+----+--------+-----------+---+------+
| ABC|a.b.cdef|[a, b.cdef]| a|b.cdef|
+----+--------+-----------+---+------+
诀窍是使用正确的String.split:
public String[] split(String regex, int limit)围绕给定正则表达式的匹配拆分此字符串。
limit 参数控制应用模式的次数,因此会影响结果数组的长度。
如果限制为正,则模式将最多应用限制 - 1 次,数组的长度将不大于限制,并且数组的最后一个条目将包含最后一个匹配分隔符之外的所有输入。
推荐阅读
- python - 如何在 pandas 数据帧的每 n 行中删除 p 行?
- django - 字段“id”需要一个数字但得到“127.0.0.1”
- c - 如何使用 '%c' 和 scanf() 输入字符串
- android - Android 上的 ConfigFS 出现“功能未实现”错误
- javascript - 如何在电子 nodejs 中创建自定义字母字符映射
- python - 如果其中发生异常,实例化一个新的相同线程会导致堆栈溢出(python)吗?
- firebase - 访问 Firebase 存储时 App Engine 中的 502(错误网关)
- android - 如何使用导航组件在 Android 片段转换上收听转换完成?
- git - Git:如何从主仓库的子模块文件夹中跟踪文件?
- python - 更改表的数组中的变量