当前位置: 首页 > 知识库问答 >
问题:

Pyspark,当一列中有多个分隔符时如何拆分[重复]

江同化
2023-03-14
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个答案

唐珂
2023-03-14

如果我读得正确,并且示例数据没有被分割成多行,但看起来像“两个朋友的故事/改编…”,那么看起来应该能够使用CSV解析器加载数据。CSV代表逗号分隔的值,通常看起来像:

name,value
foo,10
bar,20

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

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

如果您想使用逗号进行拆分,那么很烦人,但幸运的是,几乎每个CSV解析器都能为您工作。

查看spack-csv以获取DataFrame方法或Python CSV库。

使用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(...)
 类似资料:
  • 我有一个PySpark数据帧,其中一列包含逗号分隔的值。该列包含的值的数量是固定的(例如4)。示例: 在这里,我想将col2拆分为4个单独的列,如下所示: 如何做到这一点?

  • 我有一个火花数据框如下,并希望分裂成3的空间列。 下面是预期的结果。第一项留在text1列,第二项转到text2,其余的都转到text3(如果有)。原始列值可能包含空记录或带有任意数量分隔符的值,分隔符是空格。 提前感谢!

  • 问题内容: 如何在JavaScript中使用多个分隔符拆分字符串?我正在尝试在逗号和空格上进行拆分,但是AFAIK,JS的拆分功能仅支持一个分隔符。 问题答案: 传递正则表达式作为参数: 编辑添加: 您可以通过选择数组的长度减去1来获得最后一个元素: …,如果模式不匹配:

  • 我的问题是如何将一列拆分为多个列。我不知道为什么 不起作用。 例如,我想将“df_test”更改为“df_test2”。我看到了很多使用熊猫模块的例子。还有别的办法吗?提前感谢您。 df_test2

  • 我有: 我想要: 似乎在scala中我可以写:< code>df.select($"value。_1 ",$ "值。_2 ",$ "值。_3"),但这在python中是不可能的。 那么有没有好的办法呢?