2016-02-03 6 views
0

Я создал кадр данных pandas из некоторых сообщений StackOverFlow. Используется lxml.eTree для разделения кода_блоков и текстовых блоков. Приведенный ниже код показывает основную схему:Ошибка при преобразовании кадра данных pandas в искривление DataFrame

import lxml.etree 

a1 = tokensentRDD.map(lambda (a,b): (a,''.join(map(str,b)))) 
a2 = a1.map(lambda (a,b): (a, b.replace("&lt;", "<"))) 
a3 = a2.map(lambda (a,b): (a, b.replace("&gt;", ">"))) 

def parsefunc (x): 
    html = lxml.etree.HTML(x) 
    code_block = html.xpath('//code/text()') 
    text_block = html.xpath('// /text()') 

    a4 = code_block 
    a5 = len(code_block) 
    a6 = text_block 
    a7 = len(text_block) 
    a8 = ''.join(map(str,text_block)).split(' ') 
    a9 = len(a8) 
    a10 = nltk.word_tokenize(''.join(map(str,text_block))) 

    numOfI = 0 
    numOfQue = 0 
    numOfExclam = 0 

    for x in a10: 
     if x == 'I': 
      numOfI +=1 
     elif x == '?': 
      numOfQue +=1 
     elif x == '!': 
      numOfExclam 
    return (a4,a5,a6,a7,a9,numOfI,numOfQue, numOfExclam) 

a11 = a3.take(6) 
a12 = map(lambda (a,b): (a, parsefunc(b)), a11) 

columns = ['code_block', 'len_code', 'text_block', 'len_text', '[email protected]_block', 'numOfI', 'numOfQ', 'numOfExclam'] 
index = map(lambda x:x[0], a12) 
data = map(lambda x:x[1], a12) 

df = pd.DataFrame(data = data, columns = columns, index = index) 
df.index.name = 'Id' 
df 

    code_block len_code text_block len_text [email protected]_block numOfI numOfQ numOfExclam 
Id        
4 [decimal 3 [I want to use a track-bar to change a form's ... 18 72 5 1 0 
6 [div, ]  5 [I have an absolutely positioned , div, conta... 22 96 4 4 0 
9 [DateTime] 1 [Given a , DateTime, representing a person's ... 4 21 2 2 0 
11 [DateTime] 1 [Given a specific , DateTime, value, how do I... 12 24 2 1 0 

Мне нужно создать искру DataFrame на заказ для применения алгоритмов машинного обучения на выходе. Я пробовал:

sqlContext.createDataFrame(df).show() 

Ошибки я получаю это:

TypeError: not supported type: <class 'lxml.etree._ElementStringResult'> 

Может кто-нибудь сказать мне правильный способ, чтобы преобразовать панда DataFrame в искре DataFrame?

+1

Вы опустили самую важную часть кода ('return (list of variables)'). – zero323

+0

Извините, где я должен включить его? –

+0

Просто [отредактируйте вопрос] (https://stackoverflow.com/posts/35182717/edit), поэтому ясно, что возвращается из функции. Пример ввода также полезен. – zero323

ответ

0

Ваша проблема не связана с Пандами. Оба code_block (a4) и text_block (a6) содержат lxml конкретные объекты, которые не могут быть закодированы с использованием типов SparkSQL. Преобразование их в строки должно быть достаточно.

a4 = [str(x) for x in code_block] 
a6 = [str(x) for x in text_block] 
+0

Он работал, но не отображает столбец индекса (тот, который имеет значения «Id»). Не могли бы вы рассказать мне, как указать Index в Spark DataFrame? –

+0

Невозможно. Spark DataFrames не поддерживают индексы. Если вы хотите включить его, вы должны преобразовать его в обычный столбец. – zero323