基于广播变量的pyspark过滤器数据帧

时间:2018-09-25 13:49:47

标签: python pyspark broadcast

我有一个pyspark 2.0数据框,我试图根据(相对)较短的列表进行过滤-长度可能为50-100。

UserViewSet

我想将该列表广播到我的每个节点,并使用它删除列表中没有两列之一的记录。

此操作有效:

SAFE_METHODS

但是当我广播列表时,我得到一个错误:

from rest_framework.permissions import BasePermission, SAFE_METHODS

class IsAdminOrReadOnly(BasePermission):

    def has_permission(self, request, view):
        if request.method in SAFE_METHODS:
            return True

        return request.user and request.user.is_staff

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = serializers.UserSerializer
    permission_classes = (IsAdminOrReadOnly,)
    ...

关于我应该如何基于广播列表过滤pyspark 2.0数据帧的任何想法?

1 个答案:

答案 0 :(得分:3)

您不能直接在DataFrame函数中访问Broadcast变量,而是使用“值”来访问Broadcast变量的值。

因此,如下修改您的代码:

filterListB= sc.broadcast(filterList)
filter_df= df.where((df['Foo'].isin(filterListB.value)) | (df['Bar'].isin(filterListB.value)))

参考:https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-broadcast.html