SparkSQL UDF 반환 형식 은 NUMPY 형식 을 포함 할 수 없습니다.

8972 단어 빅 데이터
저작권 성명: 본 고 는 블 로 거들 이 창작 한 글 로 블 로 거들 의 허락 없 이 전재 할 수 없다.
Spark 버 전: 2.1.1
질문: SparkSQL UDF 반환 형식 은 NUMPY 형식 을 포함 합 니 다.
PickleException: expected zero arguments for construction of ClassDict (for numpy.dtype)
아래 코드 에서 보 듯 이 정 의 된 udf 반환 형식 은 dict 를 포함 하 는 list 입 니 다. udf 에 배열 순 서 를 추가 하고 기본 값 을 부여 합 니 다. 이렇게 쓰 면 상기 오 류 를 보고 합 니 다.
import pandas as pd
from pyspark.sql import functions as F
from pyspark.sql.types import MapType, StringType, ArrayType


def calc_allocate(collect_list):
    df_assign = pd.DataFrame(collect_list)
    #           
    df_assign["rank"] = range(1, df_assign.shape[0] + 1)
    return_allocate = []

    for i in range(1, df_assign.shape[0] + 1):
        allocate_dict = dict()
        allocate_dict["id"] = df_assign.loc[df_assign["rank"] == i, "id"].values[0]
        allocate_dict["rank"] = df_assign.loc[df_assign["rank"] == i, "rank"].values[0]
        return_allocate.append(allocate_dict)

    return return_allocate


if __name__ == '__main__':
    collect_list = [
        {u'id': u'1'},
        {u'id': u'2'},
        {u'id': u'3'},
        {u'id': u'4'},
        {u'id': u'5'}
    ]
    data_allocate_compute = calc_allocate(collect_list)
    #   udf
    udf_calc_allocate = F.udf(collect_list, returnType=ArrayType(MapType(StringType(), StringType())))

Spark 2.1.1 의 공식 문 서 를 참고 하면 SparkSQL 은 numpy 의 데이터 형식 과 같은 인용 형식 을 사용 할 수 없습니다.
Python DataTypes No Longer Singletons
When using DataTypes in Python you will need to construct them (i.e. StringType() ) instead of referencing a singleton.
-- 발췌http://spark.apache.org/docs/2.1.1/sql-programming-guide.html#python-datatypes-no-longer-singletons
필드 형식 을 보면 알 수 있 듯 이 배열 배열 'rank' 을 추가 할 때 유형 은 numpy. int 64 이기 때문에 오류 가 발생 할 수 있 습 니 다.
print type(df_assign.loc[df_assign["rank"] == i, "rank"].values[0])


해결 방법: 값 을 할당 할 때 python 기본 형식 을 강제로 변환 합 니 다.
allocate_dict["rank"] = int(df_assign.loc[df_assign["rank"] == i, "rank"].values[0])

높 은 버 전에 서 는 2.4.3 과 같은 새로운 문 서 를 numpy 로 되 돌려 주 는 것 을 지원 합 니 다.
http://spark.apache.org/docs/latest/sql-pyspark-pandas-with-arrow.html#pandas-udfs-aka-vectorized-udfs
저작권 성명: 본 고 는 블 로 거들 의 오리지널 글 로 블 로 거들 의 허락 없 이 서명 (BY): dkjkls (dkj 칼 로 스) 글 의 출처 를 전재 할 수 없습니다.http://blog.csdn.net/dkjkls

좋은 웹페이지 즐겨찾기