Pyspark基于languag过滤行

2024-04-20 04:39:51 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题与Pyspark有关。我正在读一个只有几列的TSV文件。一个特定的列是comment列。我的任务是根据语言筛选出行。例如,如果注释是俄语的,那么我希望过滤该行并将其保存在单独的文件中。在

现在,在阅读文件时,我正在使用下面的代码,这是制造数据帧。在

Info = sqlContext.read.format("csv"). \
option("delimiter","\t"). \
option("header", "True"). \
option("inferSchema", "True"). \
load("file.tsv")

DataFrame[ID: int Comments: string]

然后,我尝试使用ORD函数根据ASCII值筛选出记录:

^{pr2}$

但是,我得到一个错误:

TypeError: argument 2 to map() must support iteration

样本输入:

Comments

{175:'Аксессуары'}
{156:'Горные'}
{45:'Кровати, диваны и кресла'}
{45:'Кровати, диваны и кресла'}

请提出一些解决办法。如有任何建议,不胜感激。在

更新时间:

@ags29

我已经通过编写这段代码纠正了我在评论中提到的错误。在

spark_ord=F.udf(lambda x: [ord(c) for c in x],t.ArrayType(IntegerType()))
Info=Info.withColumn('russ', spark_ord('Comments'))

DataFrame[ID: int, Comments: string, russ: array<int>]

现在的问题是它正在创建数组[Int]。我必须根据数组中的值筛选整行,该值应该小于128。在

我正在努力实现这个目标。请提出建议。在


Tags: 文件代码infoidtruedataframestring错误
2条回答

@ags29谢谢你的建议。在

答案如下:

在通过读取上面提到的文件来创建数据帧之后,我们必须用一些值替换空值,在本例中,我将其替换为NA。在

InfoWoNull = Info.fillna({'Comments':'NA'})

然后,使用ORD函数创建UDF以查找字符串中每个字符的ASCII值。输出将是整数数组。在

^{pr2}$

创建过滤器函数,根据大于127的ASCII字符过滤出值。在

def russian_filter(x):
for index in range(len(x)):
    if x[index] > 127:
    return True
return False

filter_udf = F.udf(russian_filter, BooleanType())

在下面的最后一步中使用它。在

Info_rus = InfoWoNull.filter(filter_udf(russ_ord('SearchParams')) == 'true')
Info_rus.show()

这还没有经过测试,但以下几点应该是可行的:

from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType

# create user defined function from ord
spark_ord=udf(lambda x: ord(x), IntegerType())

Info=Info.withColumn('ord', spark_ord('Comments'))
Info=Info.filter('ord<128')

基本上,要将ord函数用于数据帧,您需要一个用户定义的函数。您尝试的方法需要RDD,而不是DataFrame

相关问题 更多 >