Pyspark,当一列中有多个分隔符时如何分割

时间:2018-04-13 23:33:32

标签: apache-spark split pyspark

rdd1=sc.textFile('/user/training/checkouts').map(lambda line:line.split(',')).map(lambda fields:((fields[1],fields[3],fields[5]), 1) )

我使用上面的命令只根据字段[1],字段[3]和字段[5]获取值。

下面的值是我得到的实际输出,因为输入文件中的第二列包含几个用于分割行的逗号。当有多个分隔符时,如何分割数据?或者有什么方法可以放弃我不想使用的表格?我想删除几个有长字符串的列,这会导致这个问题发生

[((u'BibNum', u'ItemCollection', u'ItemLocation'), 1),
 ((u'3011076', u' 1481425749', u' 9781481425742"'), 1),
 ((u'2248846', u' c1999."', u'"'), 1)]

我期待以下输出。

   [((u'BibNum', u'ItemCollection', u'ItemLocation'), 1),
     ((u'3011076', u' qna, u' ncrdr"'), 1),
     ((u'2248846', u' qkb."', ncstr'"'), 1)]

我会上传示例输入值,以便您理解我的问题,

3011076,
"A tale of two friends / adapted by Ellie O'Ryan ; illustrated by Tom Caulfield, Frederick Gardner, Megan Petasky, and Allen Tam.",
"O'Ryan, Ellie",
"1481425730, 1481425749, 9781481425735, 9781481425742",
2014.,
"Simon Spotlight,",
"Musicians Fiction, Bullfighters Fiction, Best friends Fiction, Friendship Fiction, Adventure and adventurers Fiction",
jcbk,
ncrdr,
Floating,
qna,
09/01/2017,
1

正如你所看到的,在这个示例输入中,在第二行中,它包含了许多逗号,它使我不会分裂。

1 个答案:

答案 0 :(得分:1)

如果我正确读取此内容,并且示例数据未分成多行但看起来像3011076,"A tale of two friends / adapted...,那么看起来您应该能够使用CSV解析器来加载数据。 CSV代表以逗号分隔的值,通常类似于:

name,value
foo,10
bar,20

但当然name可能有逗号,所以有方法用双引号将它们括起来

name,value
foo,10
bar,20
"baz,qux",40

如果您想要用逗号分隔,那么很烦人,但很幸运的是,几乎每个CSV解析器都适合您。

查看spark-csv以获取DataFrame方法或Python CSV library

使用RDD和Python CSV:

import csv
rdd1 = sc.textFile('/user/training/checkouts') \
    .map(lambda line: next(csv.reader([line]))) \
    .map(lambda fields:((fields[1],fields[3],fields[5]), 1))

但是我强烈建议您查看spark-csv库,因为您可能会获得更好的性能。

df = sqlContext.read \
    .format('com.databricks.spark.csv') \
    .load('/user/training/checkouts')
df.select(...)