【发布时间】:2019-05-25 20:20:04
【问题描述】:
我试图从我的单词数组中仅删除数字单词,但我创建的函数无法正常工作。当我尝试从我的数据框中查看信息时,会出现以下错误消息
首先我转换了我的字符串和单词标记
from pyspark.ml.feature import RegexTokenizer
regexTokenizer = RegexTokenizer(
inputCol="description",
outputCol="words_withnumber",
pattern="\\W"
)
data = regexTokenizer.transform(data)
我创建了只删除数字的函数
from pyspark.sql.functions import when,udf
from pyspark.sql.types import BooleanType
def is_digit(value):
if value:
return value.isdigit()
else:
return False
is_digit_udf = udf(is_digit, BooleanType())
调用函数
data = data.withColumn(
'words_withoutnumber',
when(~is_digit_udf(data['words_withnumber']), data['words_withnumber'])
)
错误:
org.apache.spark.SparkException:作业因阶段失败而中止:阶段 5.0 中的任务 0 失败 4 次,最近一次失败:阶段 5.0 中丢失任务 0.3(TID 14、10.139.64.4、执行程序 0):org .apache.spark.api.python.PythonException:回溯(最近一次调用最后一次):
示例数据框
+-----------+-----------------------------------------------------------+
|categoryid |description |
+-----------+-----------------------------------------------------------+
| 33004|["short","sarja", "40567","detalhe","couro"] |
| 22033|["multipane","6768686868686867868888","220v","branco"] |
+-----------+-----------------------------------------------------------+
预期结果
+-----------+-----------------------------------------------------------+
|categoryid |description |
+-----------+-----------------------------------------------------------+
| 33004|["short","sarja","detalhe","couro"] |
| 22033|["multipane","220v","branco"] |
+-----------+-----------------------------------------------------------+
【问题讨论】:
-
您 udf 需要一个字符串,但您将一个数组传递给它。同样在您的示例数据框中,
description应该是words_withnumber? -
您需要iterate over the array 并过滤掉所需的单词。你用的是什么版本的火花?
-
@Psidom,我尝试循环遍历数组,但收到以下错误消息“未定义名称'ArrayType'
-
@pault 版本火花 2.3.1。我看到链接,我试试这个 filter_udf = udf(lambda row: [x for x in row if is_digit(x)], ArrayType(StringType())) ,我收到错误“名称'ArrayType'未定义” – user3661384 25分钟前
-
from pyspark.sql.types import ArrayType