2016-07-07 3 views
2

私はmoocを取っています。pyspark.sqlのdata.frame理解機能

これは、列が小文字に変換する必要があるつの割り当てを有しています。 sentence=lower(column)はそのトリックを行います。しかし、当初私は構文がsentence=column.lower()であるべきだと思った。私はドキュメントを見て、私は構文の問題を理解できませんでした。オンライン文書と関数定義を検索することによって、私が間違った構文をしていることをどのように理解できたかを説明することは可能でしょうか?

This linkはそのstring.lower(示して、私は特別に混乱しています)は、通常の文字列のPythonオブジェクトの場合のトリック

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)) 

答えて

2

あなたが正しいを行います。文字列を扱っているときに、小文字に変換する場合は、str.lower()を使用する必要があります。

そして、あなたはPython Documentationで文字列のページをチェックすると、あなたはそれはあなたが期待するように動作するはずです方法があるでしょう。しかし

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

を。あなたは、単一の文字列で作業していないremovePunctuationあなたの機能で、提供さスパークの例では、あなたはで作業しています。また、列は文字列とは別のオブジェクトです。つまり、列で動作するメソッドを使用する必要があります。

具体的には、このpyspark sql methodで作業しています。どのメソッドを実装する必要があるのか​​が次に疑われるときは、オブジェクトのデータ型を再確認してください。また、あなたは輸入品のリストを確認した場合、あなたはそれがこれは私がそれを行うために管理方法ですpyspark.sql.functions

+0

私は列が異なっていることに同意します文字列よりもオブジェクトの型。しかし、どのようにすれば '' .lower() ''がそれと動作しないのか、 '' lower(column) ''になるはずです。ドキュメントdoesntは、実際の例を示すので、私は正しい構文を理解する方法を知っているだろう! – user2543622

+0

さて、呼び出されたメソッドの "署名"を確認することができます。あなたは** removePunctuationへの呼び出しを確認した場合**この行で: '.select(removePunctuation(COL( '文')))'は 'removePunctuation'を呼び出す前に、それは' COL( '文')を呼び出していることがわかります'。 [col](https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.col)のドキュメントで、** Columnを返すことができます**。また、このメソッドのコメントでは、removePunctuationは、文字列ではなくColumnとして引数として受け取られることを示しています。 –

+0

私はここではっきりしないと思います。私は入力がcol形式であることを理解しています。しかし、col形式の場合、私は 'lower(col) 'を使う必要があり、' col.lower() 'を使うことができないことをどのように知っていますか? – user2543622

0

からlowerメソッドを呼び出して表示されます。

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') 
関連する問題