基于中间值的Pyspark数据帧过滤器
我有一个Pyspark数据框,其值如下-基于中间值的Pyspark数据帧过滤器,pyspark,Pyspark,我有一个Pyspark数据框,其值如下- [Row(id='ABCD123', score='28.095238095238095'), Row(id='EDFG456', score='36.2962962962963'), Row(id='HIJK789', score='37.56218905472637'), Row(id='LMNO1011', score='36.82352941176471')] 我只想要来自DF的值,这些值的分数介于输入分数值和输入分数值+1之间,比如说,输入
[Row(id='ABCD123', score='28.095238095238095'), Row(id='EDFG456', score='36.2962962962963'), Row(id='HIJK789', score='37.56218905472637'), Row(id='LMNO1011', score='36.82352941176471')]
我只想要来自DF的值,这些值的分数介于输入分数值和输入分数值+1之间,比如说,输入分数值是36,那么我想要输出DF,只有两个id-EDFG456&LMNO1011,因为它们的分数介于36和37之间。我通过以下方式实现了这一点-
input_score_value = 36
input_df = my_df.withColumn("score_num", substring(my_df.score, 1,2))
output_matched = input_df.filter(input_df.score_num == input_score_value)
print(output_matched.take(5))
上面的代码给出了下面的输出,但处理2 mil行所需的时间太长。我在想是否有更好的方法来缩短响应时间
[Row(id='EDFG456', score='36.2962962962963'), Row(id='LMNO1011',score='36.82352941176471')]
您可以使用该函数
它应该比
子字符串
快得多。让我知道 你好@lrnzcig,恐怕还是一样的响应时间!好啊好的,最后,你必须阅读200万行的专栏,我想这是不可避免的。。。据我所知,您无法加快速度,但是,如果您要多次这样做,可能您可以添加一个新列floor(input\u df.score\u num)
,然后按该列重新划分数据集。重新分区本身需要相当长的时间,但之后查询应该会相当快。顺便说一下,我的答案中有一个拼写错误,我想你看到了,但我更正了它。
from pyspark.sql.functions import floor
output_matched = input_df.filter(foor(input_df.score_num) == input_score_value)
print(output_matched.take(5))