将np.sign应用于pyspark系列,即使使用udf也无法工作

将np.sign应用于pyspark系列,即使使用udf也无法工作,pyspark,Pyspark,我目前正在尝试使用numpy内置函数np.sign将所有行值转换为特定符号 我的代码: import numpy as np pd_dataframe = pd.DataFrame({'id': [i for i in range(10)], 'values': [10,5,3,-1,0,-10,-4,10,0,10]}) sp_dataframe = spark.createDataFrame(pd_dataframe) sign_a

我目前正在尝试使用numpy内置函数np.sign将所有行值转换为特定符号

我的代码:

import numpy as np
pd_dataframe = pd.DataFrame({'id': [i for i in range(10)],
                             'values': [10,5,3,-1,0,-10,-4,10,0,10]})

sp_dataframe = spark.createDataFrame(pd_dataframe)
sign_acc_row = F.udf(lambda x: np.sign([x]), IntegerType())
sp_dataframe = sp_dataframe.withColumn('sign', sign_acc_row('values'))
sp_dataframe.show()
错误:

y4JJavaError: An error occurred while calling o2586.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 320.0 failed 1 times, most recent failure: Lost task 0.0 in stage 320.0 (TID 3199, localhost, executor driver): net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.core.multiarray._reconstruct)
预期产出:

    id  values  sign
0   0   10  1
1   1   5   1
2   2   3   1
3   3   -1  -1
4   4   0   0
5   5   -10 -1
6   6   -4  -1
7   7   10  1
8   8   0   0
9   9   10  1
    id  values  sign    numbering
0   0   10  1   1
1   1   5   1   1
2   2   3   1   1
3   3   -1  -1  2
4   4   0   0   3
5   5   -10 -1  4
6   6   -4  -1  4
7   7   10  1   5
8   8   0   0   6
9   9   10  1   7
如果允许,附带问题:

我想创建另一个列,当值与前一行不同时,该列将额外返回1

预期产出:

    id  values  sign
0   0   10  1
1   1   5   1
2   2   3   1
3   3   -1  -1
4   4   0   0
5   5   -10 -1
6   6   -4  -1
7   7   10  1
8   8   0   0
9   9   10  1
    id  values  sign    numbering
0   0   10  1   1
1   1   5   1   1
2   2   3   1   1
3   3   -1  -1  2
4   4   0   0   3
5   5   -10 -1  4
6   6   -4  -1  4
7   7   10  1   5
8   8   0   0   6
9   9   10  1   7

你就快到了
np.sign
返回pyspark无法理解的
numpy.int64
对象。要使它们兼容,您可以执行以下操作:

sign_acc_row = F.udf(lambda x: int(np.sign(x)), IntegerType())

哇!我有很多东西要学,非常感谢你对我的帮助。顺便问一下,你知道随着人数的增加,我怎样才能做到吗。示例:111-101110-1将返回111234456?这意味着在它改变为另一个不同的值后,增加一个。简单的解释是1(1)->1(2)->0(3)->0(3,仍然是3,因为它是相同的)->1(4,因为它不同)没有理解,你能用这个和预期的输出编辑你的问题吗?有趣的问题,看起来好像以前没有回答过,你能不能为这个问题提出一个新的问题,这样其他人也能从中受益。