【问题标题】:Handling multi line and carriage return in pyspark在 pyspark 中处理多行和回车
【发布时间】:2020-08-19 09:27:14
【问题描述】:

我有一个 csv 文件,其中包含文本字段的文本限定符“”。该文件还包含在某些字段中带有回车的多行。我查看了其他 stackoverflow 帖子,但找不到可以帮助我解决我面临的问题的帖子。数据是这样的

在此处提交文件:dropbox.com/sh/nqmhdckae628ntc/AAAK7lU6wJcWkPTv5y3ZWyhRa?dl=0

"Project ID","Initiative Name",Status,Type,Submitter,"Submitted Date",CEP,Maverick,Toolbox,"External Labour",M&A,"Embedded in Plan","Start Date","End Date",Category,"TS Prime","VP Reporting Group","Benefiting BU","Vendor Name","TS Finance Prime","TS Director Prime","TS VP Prime","Finance Approved","Delivery Model",Baseline,"WLS Allocation","WLN Allocation"
1234,"xyz",Incremental,"Budget Impacting Savings","Some VP","2019-10-31 14:54:14.670",FALSE,FALSE,FALSE,FALSE,FALSE,"Embedded in plan",2019-09-09,2020-09-08,"Information Technology","some vp",Procurement,"some info some info
some info
some info
some info","something","some vp","some vp","another vp",Yes,"whatever",1.68,1,1
123,"abc",Incremental,"Non-Budget Impact Savings","some vp","2020-01-22 15:48:57.323",FALSE,FALSE,FALSE,FALSE,FALSE,,2020-01-14,2020-05-31,"Information Technology","some vp",Procurement,"some info
some info
some info",something,"some vp","some vp","some vp",,"whatever",2,0,10

这里有两条记录“项目 ID”1234 和 123。当我将此文件读入 pandas 时,它就完成了这项工作:

df_test= pd.read_csv('data.csv',sep=",",quotechar='"')

第一行的输出如下所示:

Project ID                                                         1234
Initiative Name                                                     xyz
Status                                                      Incremental
Type                                           Budget Impacting Savings
Submitter                                                       Some VP
Submitted Date                                  2019-10-31 14:54:14.670
CEP                                                               False
Maverick                                                          False
Toolbox                                                           False
External Labour                                                   False
M&A                                                               False
Embedded in Plan                                       Embedded in plan
Start Date                                                   2019-09-09
End Date                                                     2020-09-08
Category                                         Information Technology
TS Prime                                                        some vp
VP Reporting Group                                          Procurement
Benefiting BU         some info some info\r\nsome info\r\nsome info\...
Vendor Name                                                   something
TS Finance Prime                                                some vp
TS Director Prime                                               some vp
TS VP Prime                                                  another vp
Finance Approved                                                    Yes
Delivery Model                                                 whatever
Baseline                                                           1.68
WLS Allocation                                                        1
WLN Allocation                                                        1
Name: 0, dtype: objectenter code here

我们可以在输出列 Benefiting BU 中看到 /r/n。我想使用 pyspark 在 spark 中读取文件。我们正在处理的文件平均为 4.5GB。 Pandas 无法处理如此大的文件,因此使用 spark 加载和处理文件。我尝试使用“option(“multiLine”,“true”)”读取 pyspark 中的文件,但它似乎不起作用。它只给了我一条记录,那就是第一条。它无法识别第二行。

df = spark.read.format("csv").option("header", "true").option("inferSchema", "true").option("quote",'"').option("escape","/"").option("multiLine","true").csv("data.csv")
df.show()


  +----------+---------------+-----------+--------------------+---------+--------------------+-----+--------+-------+---------------+-----+----------------+----------+----------+--------------------+--------+------------------+--------------------+-----------+----------------+-----------------+-----------+----------------+--------------+--------+--------------+--------------+
|Project ID|Initiative Name|     Status|                Type|Submitter|      Submitted Date|  CEP|Maverick|Toolbox|External Labour|  M&A|Embedded in Plan|Start Date|  End Date|            Category|TS Prime|VP Reporting Group|       Benefiting BU|Vendor Name|TS Finance Prime|TS Director Prime|TS VP Prime|Finance Approved|Delivery Model|Baseline|WLS Allocation|WLN Allocation|
+----------+---------------+-----------+--------------------+---------+--------------------+-----+--------+-------+---------------+-----+----------------+----------+----------+--------------------+--------+------------------+--------------------+-----------+----------------+-----------------+-----------+----------------+--------------+--------+--------------+--------------+
|      1234|            xyz|Incremental|Budget Impacting ...|  Some VP|2019-10-31 14:54:...|false|   false|  false|          false|false|Embedded in plan|2019-09-09|2020-09-08|Information Techn...| some vp|       Procurement|some info some in...|  something|         some vp|          some vp| another vp|             Yes|      whatever|    1.68|             1|         1
123|
+----------+---------------+-----------+--------------------+---------+--------------------+-----+--------+-------+---------------+-----+----------------+----------+----------+--------------------+--------+------------------+--------------------+-----------+----------------+-----------------+-----------+----------------+--------------+--------+--------------+--------------+

注意它是如何从第二行而不是整个行中获取第一个元素并将其视为第一行的一部分。当我执行 df.count() 时,它只给了我 1,而它应该给我 2,因为我有 2 条记录。如果我在没有 multiLine 选项的情况下读取 csv,它会将每个新行识别为一行,这是公平的,因为 spark 是以这种方式构建的,但这不是我想要的。

谁能指出我正确的方向。非常感谢您的帮助。如果有人想重新创建问题,我不知道是否可以上传我在此处向您展示的测试文件。

【问题讨论】:

  • 提供您的 data.csv 样本。
  • @Lamanus 我如何在这里上传?
  • 复制并粘贴到您的问题中。
  • @Lamanus 在我的问题中。它是第一个代码块。文件中的数据就是这样的。
  • @Lamanus 对粘贴在此处的数据进行了小幅编辑。现在应该是我正在查看的相同数据。

标签: python-3.x apache-spark pyspark


【解决方案1】:

好吧,我没有指定quoteescape,但它可以工作。

df = spark.read.option("header","true").option("inferSchema","true").option("multiline","true").csv("test.csv")
df.count()

2

df.show(10, False)

+----------+---------------+-----------+-------------------------+---------+-----------------------+-----+--------+-------+---------------+-----+----------------+----------+----------+----------------------+--------+------------------+-------------------------------------------------+-----------+----------------+-----------------+-----------+----------------+--------------+--------+--------------+--------------+
|Project ID|Initiative Name|Status     |Type                     |Submitter|Submitted Date         |CEP  |Maverick|Toolbox|External Labour|M&A  |Embedded in Plan|Start Date|End Date  |Category              |TS Prime|VP Reporting Group|Benefiting BU                                    |Vendor Name|TS Finance Prime|TS Director Prime|TS VP Prime|Finance Approved|Delivery Model|Baseline|WLS Allocation|WLN Allocation|
+----------+---------------+-----------+-------------------------+---------+-----------------------+-----+--------+-------+---------------+-----+----------------+----------+----------+----------------------+--------+------------------+-------------------------------------------------+-----------+----------------+-----------------+-----------+----------------+--------------+--------+--------------+--------------+
|1234      |xyz            |Incremental|Budget Impacting Savings |Some VP  |2019-10-31 14:54:14.670|false|false   |false  |false          |false|Embedded in plan|2019-09-09|2020-09-08|Information Technology|some vp |Procurement       |some info some info
some info
some info
some info|something  |some vp         |some vp          |another vp |Yes             |whatever      |1.68    |1             |1             |
|123       |abc            |Incremental|Non-Budget Impact Savings|some vp  |2020-01-22 15:48:57.323|false|false   |false  |false          |false|null            |2020-01-14|2020-05-31|Information Technology|some vp |Procurement       |some info
some info
some info                    |something  |some vp         |some vp          |some vp    |null            |whatever      |2.0     |0             |10            |
+----------+---------------+-----------+-------------------------+---------+-----------------------+-----+--------+-------+---------------+-----+----------------+----------+----------+----------------------+--------+------------------+-------------------------------------------------+-----------+----------------+-----------------+-----------+----------------+--------------+--------+--------------+--------------+

表格损坏的地方,但您会看到有两行。

【讨论】:

  • 我的问题仍然没有解决。我正在通过 Dropbox 与您共享文件。链接在这里dropbox.com/sh/nqmhdckae628ntc/AAAK7lU6wJcWkPTv5y3ZWyhRa?dl=0也许你从问题中复制它的方式可能没有造成问题。
  • 您使用的是 Windows 操作系统吗?我已经在 Linux docker 映像上进行了测试,但 Windows 和你一样失败了。嗯...
  • 是在 Windows 10 和 spark 版本 3.0.0 上
  • :( 多次尝试和搜索但找不到答案,抱歉。仅当操作系统为 Windows 时才会发生这种情况。
  • 我会接受你的回答,因为我在运行 linux 的 VM 上尝试过这个并且它可以工作。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
相关资源
最近更新 更多