2016-07-07 14 views
2

Ich nehme eine mooc.pyspark.sql data.frame Funktionen zu verstehen

Es hat eine Zuweisung, bei der eine Spalte in den Kleinbuchstaben konvertiert werden muss. sentence=lower(column) macht den Trick. Aber zuerst dachte ich, dass die Syntax sentence=column.lower() sein sollte. Ich schaute auf die Dokumentation und konnte das Problem mit meiner Syntax nicht herausfinden. Wäre es möglich zu erklären, wie ich durch Suche nach Online-Dokumentation und Funktionsdefinition herausfinden könnte, dass ich eine falsche Syntax habe?

Ich bin besonders verwirrt wie This link zeigt, dass string.lower() funktioniert der Trick bei der Python regulären String-Objekte

from pyspark.sql.functions import regexp_replace, trim, col, lower 
def removePunctuation(column): 
    """Removes punctuation, changes to lower case, and strips leading and trailing spaces. 

    Note: 
     Only spaces, letters, and numbers should be retained. Other characters should should be 
     eliminated (e.g. it's becomes its). Leading and trailing spaces should be removed after 
     punctuation is removed. 

    Args: 
     column (Column): A Column containing a sentence. 

    Returns: 
     Column: A Column named 'sentence' with clean-up operations applied. 
    """ 

    sentence=lower(column) 

    return sentence 

sentenceDF = sqlContext.createDataFrame([('Hi, you!',), 
             (' No under_score!',), 
             (' *  Remove punctuation then spaces * ',)], ['sentence']) 
sentenceDF.show(truncate=False) 
(sentenceDF 
.select(removePunctuation(col('sentence'))) 
.show(truncate=False)) 

Antwort

2

Sie richtig sind. Wenn Sie mit einer Zeichenfolge arbeiten, wenn Sie sie in Kleinbuchstaben konvertieren möchten, sollten Sie str.lower() verwenden.

Und wenn Sie die String-Seite im Python Documentation überprüfen, sehen Sie, es eine untere Methode verfügt, die wie erwartet funktionieren sollte:

a_string = "StringToConvert" 
a_string.lower()      # "stringtoconvert" 

jedoch. In dem von Ihnen bereitgestellten Spark-Beispiel haben Sie in Ihrer Funktion removePunctuation NICHT mit einer einzelnen Zeichenfolge gearbeitet. Sie arbeiten mit einer Spalte. Und eine Spalte ist ein anderes Objekt als eine Zeichenkette, das heißt, Sie sollten eine Methode verwenden, die mit einer Spalte arbeitet.

Insbesondere arbeiten Sie mit dieser pyspark sql method. Wenn Sie das nächste Mal unsicher sind, welche Methode Sie implementieren müssen, überprüfen Sie den Datentyp Ihrer Objekte. wenn Sie die Liste der Importe Überprüfen Sie auch, sehen Sie, es ist der Aufruf der lower Methode von pyspark.sql.functions

+0

i einig, dass Spalte eine andere ist Objekttyp als Zeichenfolgen. Aber wie würde ich dann wissen, dass '.lower()' nicht damit arbeitet und es '' niedriger (Spalte) 'sein sollte? Das Dokument zeigt kein funktionierendes Beispiel und ich würde daher wissen, wie man die richtige Syntax erkennt! – user2543622

+0

Nun, Sie können die "Signatur" der aufgerufenen Methode überprüfen. Wenn Sie den Aufruf von ** removePunctuation ** in dieser Zeile überprüfen: '.select (removePunctuation (col ('sentence'))) werden Sie feststellen, dass vor dem Aufruf von' removePunctuation', col ('sentence') '. Sie können in der Dokumentation von [col] (https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pypark.sql.functions.col) nachlesen, dass es eine ** Spalte zurückgibt **. In den Kommentaren der Methode heißt es auch, dass removePunctuation eine Spalte als Argument anstelle einer Zeichenfolge erhält. –

+0

Ich denke, dass ich hier nicht klar bin. Ich verstehe, dass die Eingabe im Col-Format ist. Aber woher weiß ich, dass ich im Falle des col-Formats 'lower (col)' verwenden muss und ich 'col.lower()' nicht verwenden kann? – user2543622

0

Dies ist, wie ich es geschafft:

lowered = lower(column) 
np_lowered = regexp_replace(lowered, '[^\w\s]', '') 
trimmed_np_lowered = trim(np_lowered) 

return trimmed_np_lowered 
0
return trim(lower(regexp_replace(column, "\p{Punct}", ""))).alias('sentence') 
Verwandte Themen