如何基于多个空格字符将文本文件拆分为 2 列作为 scala spark 的分隔符
Posted
技术标签:
【中文标题】如何基于多个空格字符将文本文件拆分为 2 列作为 scala spark 的分隔符【英文标题】:How to split a text file into 2 columns based on multiple space chars as seperator with scala spark 【发布时间】:2021-12-31 06:36:11 【问题描述】:我在将带有分隔符“”(多个空格)的文本数据文件拆分为数据框列时遇到了困难。我加载的数据文件如下所示:
results1.show()
+--------------------+
| all|
+--------------------+
|1 hjvh hjk 9 gkk|
|2 yjg vv 87 9bh |
|3 kjn 90j jn kjn|
|4 hb jkbkj j jb |
|.... |
|.... |
|.... |
|9997 jn kjn kjn jkn|
|9998 njkj jn8 98 in|
|9999 nkj kjnkn kjnk|
我希望它像这样分成 2 个单独的列:
| No| Address |
+-------+------------------|
| 1| hjvh hjk 9 gkk|
| 2| yjg vv 87 9bh |
| 3| kjn 90j jn kjn|
| 4| hb jkbkj j jb |
| ..|
| ..|
| ..|
| 9997| jn kjn kjn jkn|
| 9998| njkj jn8 98 in|
| 9999| nkj kjnkn kjnk|
【问题讨论】:
【参考方案1】:您可以使用split
。
df.withColumn('all', f.expr("split(all, '[ ]2,')")) \
.select(f.col('all')[0], f.col('all')[1]) \
.toDF('No', 'Address').show()
+----+--------------+
| id| value|
+----+--------------+
| 1|hjvh hjk 9 gkk|
| 2|yjg vv 87 9bh |
| 3|kjn 90j jn kjn|
| 4|hb jkbkj j jb |
|9997|jn kjn kjn jkn|
|9998|njkj jn8 98 in|
|9999|nkj kjnkn kjnk|
+----+--------------+
【讨论】:
行如何将其分成两个单独的列?你能解释一下这部分“split(all, '[ ]2,')”吗? 表示空格2倍以上。【参考方案2】:您想在第一次出现 space
时使用正则表达式拆分列。
详细说明请参阅此answer。
不同的是你的分隔符是space (\s)
results1.withColumn("Temp", split($"all", "(?<=^[^\\s]*)\\s"))
.withColumn("No", $"Temp"(0))
.withColumn("Address", $"Temp"(1))
.drop("all","Temp")
.show()
输出
+----+--------------------+
| No| Address|
+----+--------------------+
| 1| hjvh hjk 9 gkk|
| 2| yjg vv 87 9bh |
| 3| kjn 90j jn kjn|
| 4| hb jkbkj j jb...|
|9997| jn kjn kjn jkn|
|9998| njkj jn8 98 in|
|9999| nkj kjnkn kjnk|
+----+--------------------+
【讨论】:
以上是关于如何基于多个空格字符将文本文件拆分为 2 列作为 scala spark 的分隔符的主要内容,如果未能解决你的问题,请参考以下文章
如何在 bash shell 中将一个字符串拆分为多个字符串,至少用一个空格分隔?
Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数(此处为1则拆分一次,列表长度为2