Обработка многострочности и возврата каретки в pyspark

#python-3.x #apache-spark #pyspark

#python-3.x #apache-spark #pyspark

Вопрос:

У меня есть CSV-файл, в котором есть текстовые квалификаторы «» для текстовых полей. Файл также содержит несколько строк с возвратами каретки в некоторых полях. Я просмотрел другие сообщения stackoverflow и не смог найти ни одного, который мог бы помочь мне с проблемой, с которой я столкнулся. Данные выглядят следующим образом

файл здесь: dropbox.com/sh/nqmhdckae628ntc/AAAK7lU6wJcWkPTv5y3ZWyhRa?dl=0

 "Project ID","Initiative Name",Status,Type,Submitter,"Submitted Date",CEP,Maverick,Toolbox,"External Labour",Mamp;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
  

Здесь есть две записи «Идентификатор проекта» 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
Mamp;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 infornsome infornsome 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
  

Мы видим, что / r / n в столбце вывода приносят пользу BU . Я хочу прочитать файл в spark с помощью pyspark. Файлы, с которыми мы имеем дело, в среднем составляют 4,5 ГБ. Pandas не может обрабатывать такие большие файлы, поэтому использует spark для загрузки и обработки файлов. Я попытался прочитать файл в pyspark, используя «option («Многострочный»,»true»)», но, похоже, это не работает. Это дает мне количество только одной записи, и это первая запись. Он не распознает вторую строку.

 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|  Mamp;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 записи. Если я читаю csv без многострочной опции, он распознает каждую новую строку как строку, что справедливо, поскольку spark построен таким образом, но это не то, что я хочу.

Может кто-нибудь, пожалуйста, указать мне правильное направление. Буду действительно признателен за помощь.Я не знаю, смогу ли я загрузить тестовый файл, который я показал вам здесь, если кто-нибудь захочет воссоздать проблему.

Комментарии:

1. предоставьте свой образец data.csv.

2. @Lamanus как я могу загрузить сюда?

3. скопируйте и вставьте это в свой вопрос.

4. @Lamanus это есть в моем вопросе. Это первый блок кода. Вот как выглядят данные в файле.

5. @Lamanus внес небольшую правку в вставленные сюда данные. Теперь это должны быть те же данные, на которые я смотрю.

Ответ №1:

Ну, я не указывал quote и escape , но это работает.

 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|Mamp;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            |
 ---------- --------------- ----------- ------------------------- --------- ----------------------- ----- -------- ------- --------------- ----- ---------------- ---------- ---------- ---------------------- -------- ------------------ ------------------------------------------------- ----------- ---------------- ----------------- ----------- ---------------- -------------- -------- -------------- -------------- 
  

где таблица разбита, но вы увидите, что в ней две строки.

Комментарии:

1. Я все еще не решил свою проблему. Я делюсь файлом с вами через dropbox. Ссылка здесь dropbox.com/sh/nqmhdckae628ntc/AAAK7lU6wJcWkPTv5y3ZWyhRa?dl=0 Возможно, способ, которым вы скопировали это из вопроса, возможно, не создал проблему.

2. Используете ли вы ОС Windows? Я тестировал на образе Linux docker, но Windows выходит из строя, как и вы. хм…

3. Да в Windows 10 и spark версии 3.0.0

4. :(Много попыток и поисков, но не удалось найти ответ, извините. Это происходит только тогда, когда установлена операционная система Windows.

5. Я собираюсь принять ваш ответ, поскольку я попробовал это на виртуальной машине под управлением Linux, и это работает. Большое спасибо за вашу помощь.