【问题标题】:How to read a delimited file using Spark RDD, if the actual data is embedded with same delimiter如果实际数据嵌入了相同的分隔符,如何使用 Spark RDD 读取分隔文件
【发布时间】:2020-12-10 10:43:21
【问题描述】:

我正在尝试将文本文件读入 rdd

我的示例数据如下

"1" "Hai    How are you!"   "56"
"2"                         "0213"

3 列带有制表符分隔符。我的数据也嵌入了相同的分隔符(How areyou!)。有人可以帮我在 pyspark 中正确解析数据吗?

my_Rdd = Spark.SparkContext.textFile("Mytext.txt").map(lambda line:line.split('\t'))

当我执行上述代码时,我得到以下输出

ColA,ColB,Colc
"1","Hai,How are you!"
"2","0123"

第 2 列拆分为第 3 列,因为它在实际数据中具有相同的分隔符,并且对于第 2 行,第 3 值被映射到第 2 列

我的预期输出是

ColA,ColB,Colc
"1","Hai    How are you!","56"
"2",,"0123"

在 Dataframe 中我可以保留引用选项,但我们如何在 RDD 中做同样的事情?

【问题讨论】:

    标签: python apache-spark pyspark rdd


    【解决方案1】:

    使用shlex.split() 忽略引号分隔符:

    import shlex
    
    sc.textFile('Mytext.txt').map(lambda line: shlex.split(line))
    

    另一个字符串示例:

    import shlex
    
    rdd = sc.parallelize(['"1"\t"Hai\tHow are you!"\t"56"']).map(lambda line: shlex.split(line))
    
    >>> rdd.collect()
    [['1', 'Hai\tHow are you!', '56']]
    

    【讨论】:

    • 我们不需要在任何地方给出 \t 分隔符吗?当我尝试这个 sn-p 时,我得到了空 RDD
    • shlex 会被任何类似空格的字符分割,因此它也会在 \t 上分割。我不明白你为什么有空的RDD。我用您提供的文本文件对此进行了测试。
    • @UnmeshaSreeVeni 请用第二个代码 sn-p 测试?
    • 是的。我试过它现在正在工作,但是当我尝试使用实际数据时它正在破坏,我有数据与引号和不带引号的组合。没有引号它不能按预期工作。我已经编辑了我的问题。
    • 可以使用spark.read.csv('Mytext.txt', sep='\t').rdd吗?我的意思是,可以手动解析它,但是既然 spark 已经有了可用的工具,为什么还要重新发明轮子呢。
    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多