Читать CSV в Spark с пропуском строк - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь загрузить данные из CSV-файла в DataFrame.Я должен использовать функцию spark.read.csv(), потому что rdd sc.fileText() не работает с конкретными данными в файле (в данных CSV есть невидимые запятые, rdd sc.fileText() разделяет их).В файле csv есть несколько строк, которые нужно пропустить при запуске:

Report <- to skip
Generated by YYYY-MM-DD <- to skip
Sessions <- to skip
<- to skip
Session of all hosts <- to skip
col1,col2,col3,col4,col5 <- it is my header
tst1,tst2,tst3,tst4,tst5 <- my data start here
tst6,tst7,tst8,tst9,tst10
...

Я хочу иметь такой фрейм данных:

tst1,tst2,tst3,tst4,tst5 <- data
tst6,tst7,tst8,tst9,tst10

Я пытался использовать функции карты и фильтра,но это не работает должным образом:

.rdd.map(lambda line: str(line).split(','))\
.filter(lambda line: len(line)>3).collect()

1 Ответ

0 голосов
/ 10 июня 2019

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

import org.apache.spark.sql.types.{StructType, StringType}

val fileSchema = new StructType()
  .add("column1", StringType)
  .add("column2", StringType)
  .add("column3", StringType)
  .add("column4", StringType)
  .add("column5", StringType)

val data = spark.read.schema(fileSchema).csv("s3a://aws-s3-test-bucket/jeremy/foo.txt")
data.show(false)

Что дает

+-----------------------+-------+-------+-------+-------+
|column1                |column2|column3|column4|column5|
+-----------------------+-------+-------+-------+-------+
|Report                 |null   |null   |null   |null   |
|Generated by YYYY-MM-DD|null   |null   |null   |null   |
|Sessions               |null   |null   |null   |null   |
|Session of all hosts   |null   |null   |null   |null   |
|col1                   |col2   |col3   |col4   |col5   |
|tst1                   |tst2   |tst3   |tst4   |tst5   |
|tst6                   |tst7   |tst8   |tst9   |tst10  |
+-----------------------+-------+-------+-------+-------+

Затем вы можете отфильтровать строки, содержащие данные, которых, как вы знаете, быть не должно, например, Строки, которые вы хотели пропустить для начала, и имена столбцов.

Я бы предложил использовать фактические имена столбцов при создании схемы, а не заполнители, которые я использовал column1 -> real_name_of_column1, чтобы получить желаемый фрейм данных. Я использовал заполнители в своем примере, чтобы подчеркнуть тот факт, что имена столбцов, которые я использовал при создании схемы, не обязательно должны быть информированы данными.

+-----------------------+-------+-------+-------+-------+
|col1                   |col2   |col3   |col4   |col5   |
+-----------------------+-------+-------+-------+-------+
|tst1                   |tst2   |tst3   |tst4   |tst5   |
|tst6                   |tst7   |tst8   |tst9   |tst10  |
...
+-----------------------+-------+-------+-------+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...