Python Pyspark-基于语言过滤行

Python Pyspark-基于语言过滤行,python,apache-spark,pyspark,spark-dataframe,pyspark-sql,Python,Apache Spark,Pyspark,Spark Dataframe,Pyspark Sql,此问题与Pyspark有关。我正在读一个TSV文件,它几乎没有列。一个特定的列是comment列。我的任务是根据语言筛选出行。例如,如果注释是俄语,则我希望过滤该特定行并将其保存在单独的文件中 现在,在阅读文件时,我正在使用下面的代码制作数据帧 Info = sqlContext.read.format("csv"). \ option("delimiter","\t"). \ option("header", "True"). \ option("inferSchema", "True").

此问题与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值筛选出记录:

Info.filter((map(ord,Info.Comments)) < 128).collect()
请提出一些解决办法。欢迎提供任何帮助/建议

更新:

@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>]
spark\u ord=F.udf(lambda x:[ord(c)表示x中的c],t.ArrayType(IntegerType())
Info=Info.withColumn('russ',spark_ord('Comments'))
数据帧[ID:int,注释:string,russ:array]
现在的问题是,它正在创建数组[Int]。我必须根据数组中的值过滤整行,该值应该小于128


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

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

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')
从pyspark.sql.functions导入udf
从pyspark.sql.types导入IntegerType
#从ord创建用户定义的函数
spark_ord=udf(lambda x:ord(x),IntegerType())
Info=Info.withColumn('ord',spark_ord('Comments'))

Info=Info.filter('ord@ags29感谢您的建议

答案如下:

在通过读取上面提到的文件来创建Dataframe之后,我们必须用一些值替换Null值,在本例中,我用NA替换它

InfoWoNull = Info.fillna({'Comments':'NA'})
然后,创建UDF,使用ORD函数查找字符串中每个字符的ASCII值。输出为整数数组

from pyspark.sql import functions as F
from pyspark.sql import types as t
from pyspark.sql.types import ArrayType, IntegerType

russ_ord=F.udf(lambda x: [ord(a) for a in x],t.ArrayType(IntegerType()))
创建筛选函数,根据大于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()

我下面的回答对您有帮助吗?如果您有任何问题,请告诉我。当我尝试运行此命令时,我发现以下错误。我猜UDF没有正确创建。Info=Info.withColumn('ord',spark_ord('Comments'))。show()TypeError:ord()应为长度为1的字符串,但未找到类型我建议首先检查输入(即,检查是否没有空值)。删除所有空值并再次测试。如果有效,则我们只需要在udf中进行错误处理。让我知道。我在尝试运行此命令时遇到错误。我猜udf没有正确创建。Info=Info.withColumn('ord',spark_ord('Comments')。show()TypeError:ord()应为长度为1的字符串,但未找到类型
Info_rus = InfoWoNull.filter(filter_udf(russ_ord('SearchParams')) == 'true')
Info_rus.show()