PySpark中Row转字符串列表出错求助:结果为何拆分为单个字符?
问题分析与解决方案
你的代码出现这个问题主要有两个核心错误,咱们一步步拆解:
错误1:sc.parallelize(a)的使用方式不对
sc.parallelize() 需要接收一个可迭代的集合(比如列表、元组)作为输入,当你直接传入单个Row对象时,Spark会把Row当成可迭代对象来遍历——而你的Row里只有一个Sentence字段,它的值是一个字符串,字符串本身也是可迭代的(每个字符都是迭代元素)。所以最终parallelize(a)会把这个句子的每个字符拆分成RDD的独立元素,这就是你最后得到一堆单个字符元组的原因。
错误2:没有正确提取Row中的Sentence字段
你在map里直接迭代line,但此时line已经是单个字符了(因为上面的错误),所以[str(x) for x in line]其实是把单个字符再拆一次(没变化),最后转成元组就变成了每个字符单独成元组元素的结果。
正确的处理方式
情况1:只是处理单个Row对象(不需要Spark)
如果只是转换这一个Row,完全没必要用Spark,直接提取字段转成元组即可:
a = Row(Sentence=u'When, for the first time I realized the meaning of death.') result = (a.Sentence,) print(result) # 输出: (u'When, for the first time I realized the meaning of death.',)
情况2:用Spark处理多个Row对象
如果是要批量处理一批Row对象,那需要修正parallelize的输入,并且正确提取字段:
# 假设你有多个Row对象,先放到列表里 rows = [ Row(Sentence=u'When, for the first time I realized the meaning of death.'), Row(Sentence=u'Another test sentence.') ] # 正确parallelize列表,而不是单个Row b = sc.parallelize(rows) # map时提取Row的Sentence字段,包装成元组 b = b.map(lambda row: (row.Sentence,)) # 查看结果 print(b.take(2)) # 输出: [(u'When, for the first time I realized the meaning of death.',), (u'Another test sentence.',)]
内容的提问来源于stack exchange,提问作者abhjt
相关产品推荐
相关产品推荐

