Pyspark: как ввести текстовый файл таким образом, чтобы он был разделен на полный стоп - PullRequest
0 голосов
/ 11 марта 2020

Когда я загружаю текстовый файл в RDD, он по умолчанию разделяется на каждую строку. Например, рассмотрим следующий текст:

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum 
has been the industry's standard dummy text ever since the 1500s. When an 
unknown printer took a galley of type and scrambled it to make a type specimen book
and publish it.

Если я загружаю его в RDD, как показано ниже, данные разбиваются на каждую строку

>>> RDD =sc.textFile("Dummy.txt")
>>> RDD.count()
    4
>>> RDD.collect()
    ['Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum ',
    'has been the industry's standard dummy text ever since the 1500s. When an ',
    'unknown printer took a galley of type and scrambled it to make a type specimen book',
    'and publish it.']

Поскольку в текстовый файл, RDD.count() дает 4 в качестве вывода. Аналогично, список RDD.collect() содержит 4 строки. Но есть ли способ загрузить ваш файл так, чтобы он распараллеливался по предложениям, а не по строкам, в этом случае вывод должен быть следующим:

>>> RDD.count()
    3
>>> RDD.collect()
    ['Lorem Ipsum is simply dummy text of the printing and typesetting industry.', 'Lorem Ipsum 
    has been the industry's standard dummy text ever since the 1500s.', 'When an unknown
    printer took a galley of type and scrambled it to make a type specimen book and publish it.']

Могу ли я передать какой-то аргумент sc.textFile такой что мои данные разделяются, когда появляется точка полной остановки, а не когда строка в текстовом файле заканчивается

Ответы [ 3 ]

0 голосов
/ 12 марта 2020

Метод textFile RDD, используемый внутри, имел oop TextInputFormat для чтения текстовых файлов. Ключ по умолчанию, пара значений переводит в смещение записи и всю запись с разделителем по умолчанию как '\ n'. Простой способ go через это - прочитать в файле метод csv dataFrame, указав разделитель как "." как показано ниже:

spark.read.option("delimiter", ".").csv("path to your file")

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

Другой способ - это настроить oop Формат по умолчанию для формата ввода текста от '\ n' до '.'

Это можно сделать следующим образом:

 val conf = new org.apache.hadoop.conf.Configuration
 conf.set("textinputformat.record.delimiter", "\u002E")
 sc.textFile.newAPIHadoopFile(file-path, 
     classOf[org.apache.hadoop.mapreduce.lib.input.TextInputFormat],
     classOf[org.apache.hadoop.io.LongWritable],
     classOf[org.apache.hadoop.io.Text],
     conf).count()

В качестве альтернативы, я думаю, вы также можете написать Ваш пользовательский метод формата ввода и используйте выше методы newAPIHadoopFile или hadoopFile для чтения в файлах

0 голосов
/ 12 марта 2020

В Scala мы можем сделать collect() + .mkString, чтобы создать строку, а затем разделить на .

Example:

spark.sparkContext.parallelize(spark.sparkContext.textFile("<file_path>").collect().mkString.split("\\.")).count()

//3

spark.sparkContext.parallelize(spark.sparkContext.textFile("<file_path>").collect().mkString.split("\\.")).toDF().show(false)

//+----------------------------------------------------------------------------------------------------------+
//|_1                                                                                                        |
//+----------------------------------------------------------------------------------------------------------+
//|Lorem Ipsum is simply dummy text of the printing and typesetting industry                                 |
//| Lorem Ipsum has been the industry's standard dummy text ever since the 1500s                             |
//| When an unknown printer took a galley of type and scrambled it to make a type specimen bookand publish it|
//+----------------------------------------------------------------------------------------------------------+
0 голосов
/ 12 марта 2020

Я получил свой ответ в одном из ответов здесь , написанном певцом . Ответ звучит так:

rdd = sc.newAPIHadoopFile(YOUR_FILE, "org.apache.hadoop.mapreduce.lib.input.TextInputFormat",
            "org.apache.hadoop.io.LongWritable", "org.apache.hadoop.io.Text",
            conf={"textinputformat.record.delimiter": YOUR_DELIMITER}).map(lambda l:l[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...