pyspark.sql data.frame了解函数

时间:2016-07-07 15:32:04

标签: spark-dataframe pyspark-sql

我正在接受mooc

它有一个赋值,其中列需要转换为小写。 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))

3 个答案:

答案 0 :(得分:2)

你是对的。当您使用字符串时,如果要将其转换为小写,则应使用str.lower()

如果您检查Python Documentation中的字符串页面,您会看到它有一个较低方法,该方法可以按预期工作:

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

然而。在您提供的Spark示例中,在您的函数removePunctuation中,您没有使用单个字符串,而是使用。并且Column是与字符串不同的对象,这是您应该使用与Column一起使用的方法。

具体来说,您正在使用此pyspark sql method。下次您对需要实现的方法有疑问时,请仔细检查对象的数据类型。此外,如果您检查导入列表,您会看到它正在调用lower

中的pyspark.sql.functions方法

答案 1 :(得分:0)

这就是我设法做到的方式:

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

return trimmed_np_lowered

答案 2 :(得分:0)

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