错误转换unicode的值-Databrick Notebook

时间:2018-11-29 17:11:40

标签: jupyter-notebook databricks

在Databricks Notebook中创建功能以删除单词中的重音

import unicodedata
import sys

from pyspark.sql.functions import translate, regexp_replace

def make_trans():
    matching_string = ""
    replace_string = ""

    for i in range(ord(" "), sys.maxunicode):
        name = unicodedata.name(chr(i), "")
        if "WITH" in name:
            try:
                base = unicodedata.lookup(name.split(" WITH")[0])
                matching_string += chr(i)
                replace_string += base
            except KeyError:
                pass

    return matching_string, replace_string

def clean_text(c):
    matching_string, replace_string = make_trans()
    return translate(
        regexp_replace(c, "\p{M}", ""), 
        matching_string, replace_string
    ).alias(c)

但是我无法更改数据框中的值,如果我按选择执行命令就可以了,但是当我应用此命令时会发生以下错误

Command error: df['productName'] = clean_text(df['productName'])

TypeError: Column is not iterable

此命令成功执行

df.select(clean_text("productName"))

我必须一次循环一行吗?这是使用Spark + Databricks的正确方法吗?

1 个答案:

答案 0 :(得分:1)

数据帧是不可变的,因此您无法更改该值。但是,您可以添加一个新列。因此,在您的情况下:

df = df.withColumn("cleanProductName", clean_text(df['productName']))

这种“感觉”起初就像复制。但是请记住,数据帧是不可变的,因此大小始终相同。可以将其视为SQL数据库中的视图。因此Select起作用。

如果您确实需要,可以从数据框中删除旧列。但是除非您实际使用该列(从示例中选择*),否则不会对整体效果产生影响。