преобразовать большой файл txt.gz в объект sqlcontext dataframe в pyspark для анализа текста - PullRequest
1 голос
/ 06 апреля 2019

Я все еще пытаюсь выучить pyspark, он мне кажется почти иностранным. Поэтому я скачал большой текстовый файл с рецензиями Amazon.

from pyspark import SparkConf, SparkContext
conf = SparkConf().setAppName('app')
sc = SparkContext(conf=conf)
from pyspark.sql import SQLContext

Вот как выглядит необработанный файл:

sc.textFile('/home/john/Downloads/Software.txt.gz').take(12)

['product/productId: B000068VBQ',
 'product/title: Fisher-Price Rescue Heroes: Lava Landslide',
 'product/price: 8.88',
 'review/userId: unknown',
 'review/profileName: unknown',
 'review/helpfulness: 11/11',
 'review/score: 2.0',
 'review/time: 1042070400',
 'review/summary: Requires too much coordination',
 "review/text: I bought this software for my 5 year old. He has a couple of the other RH software games and he likes them a lot. This game, however, was too challenging for him. The biggest problem I see is that the game requires the child to be able to maneuver the vehicle using all 4 scroll keys on the keyboard. During one exercise, which by the way you can't get to the next level until you complete this exercise, the game requires that you use the keys to move while watching out for falling lava rocks and clouds, monitor a fuel gauge, watch arrow indicators that help you determine where objects are in the arena below, and watch a scope that shows animals when you're hovering over the top of them.I tried to perform this exercise myself and got frustrated. It's just too hard to expect even a 7 year old to complete this exercise let alone a 5 year old.There are some exercises he can complete himself but they mostly require using the left, right keys.I don't know who this game would be good for. Parts of it would be too easy for someone 7 or older. Yet some parts are too difficult for those younger than that.",
 '',
 'product/productId: B000068VBQ']

Обратите внимание, что у нас есть "product / productID", "product / title", ... и т. Д. Есть 10 различных категорий, а затем пустой список, затем категории начинаются заново с "product / productID", "product / название ", ... и т. д.

Я создал парсер для разделения элементов справа от двоеточия:

def parse(x):
    result = x.split(':')
    if len(result)==1:
        return "SEPARATOR"
    else:
        return result[1]
Data1 =sc.textFile('/home/john/Downloads/Software.txt.gz').map(parse)

Я использую ту же функцию, но return result[0], чтобы получить значения слева от двоеточия, присвоить ей Data0

Я рассчитывал объединить их вместе, а затем groupByKey получит все записи для "product / productID", "product / title", ... "review / text", сгруппированные в пары ключ-значение. И в некотором смысле это сработало:

zipped = Data0.zip(Data1)
f = sorted(zipped.groupByKey().mapValues(list).collect())

Теперь f - это список кортежей, и он выглядит так:

('product/price',
 [' 8.88',
  ' 8.88',
  ' 8.88',
  ' 8.88',
  ' 8.88',
  ' 8.88',
  ' 8.88',
  ' unknown',
  ' unknown',
  ' unknown',
  ' unknown',
   .
   .
   .

То, что я действительно пытаюсь сделать, это поместить его в фрейм данных SQLContext с ключами в качестве имен столбцов и всеми записями справа в качестве записей элементов для столбца. У меня проблемы с поиском примеров по этому поводу или документации от Spark о том, как это сделать. Я могу легко преобразовать его обратно в объект RDD,

rdd = sc.parallelize(f)

И это дает мне пары ключ-значение, но теперь, как мне превратить это в искровой фрейм данных?

...