领先的空白在哪里来自这个RDD以及如何避免它?

时间:2016-12-31 22:05:08

标签: apache-spark pyspark whitespace rdd

string_integers.txt

a 1 2 3
b 4 5 6
c 7 8 9

sample.py

import re
pattern = re.compile("(^[a-z]+)\s")

txt = sc.textFile("string_integers.txt")
string_integers_separated = txt.map(lambda x: pattern.split(x))

print string_integers_separated.collect()

结果

[[u'', u'a', u'1 2 3'], [u'', u'b', u'4 5 6'], [u'', u'c', u'7 8 9']]

预期结果

[[u'a', u'1 2 3'], [u'b', u'4 5 6'], [u'c', u'7 8 9']]

2 个答案:

答案 0 :(得分:1)

您拆分锚定在字符串开头的模式,因此前缀将始终为空字符串。例如,您可以使用匹配:

npm uninstall -g angular-cli
npm cache clean
npm install -g angular-cli@latest

或lookbehind:

pattern = re.compile("([a-z]+)\s+(.*$)")
pattern.match("a 1 2 3").groups()
# ('a', '1 2 3')

或只是拆分:

pattern = re.compile("(?<=a)\s")
pattern.split("a 1 2 3", maxsplit=1)
# ['a', '1 2 3']

答案 1 :(得分:0)

目前我还不清楚领先的白色空间来自哪里。出于某种原因,正则表达式分裂正在引入它。 Based on an example found in this documentation创建了一个不再引入前导空格的分割操作:

txt.map(lambda x: x.split(' ', 1)).collect()
#[[u'a', u'1 2 3'], [u'b', u'4 5 6'], [u'c', u'7 8 9']]

<强>解释

  

str.split(str =&#34;&#34;,num = string.count(str))

     

将分割数限制为num

使用x.split(' ', 2)返回[[u'a', u'1', u'2 3'], [u'b', u'4', u'5 6'], [u'c', u'7', u'8 9']]