如何将 pandas udf 应用于大型矩阵数据框

Posted

技术标签:

【中文标题】如何将 pandas udf 应用于大型矩阵数据框【英文标题】:How to apply pandas udf to large matrix dataframe 【发布时间】:2019-08-02 01:38:20 【问题描述】:

我对 Spark 和 Pandas 非常陌生。我想将 pandas UDF 应用于没有任何列名的 numpy.ndarray 大矩阵。我应该如何定义 UDF 函数的输入?

这就是我所做的。 row 是 cassandra 数据库中的一行,'b2' 是数据库中图像的列名。

def normalize_i(I):
    iI=I
    minI=20#np.min(I)
    maxI=50#np.max(I)
    minO=0
    maxO=255
    iI = (256.0/65536)*iI
    io=(iI-minI)*(((maxO-minO)/(maxI-minI))+minO)
    return io

b2 = cPickle.loads(row.asDict()['b2'], encoding='bytes')
pdf = pd.DataFrame(b2,columns=["x"])
dfb2 = spark.createDataFrame(pdf)
dfb2.select(normalize_i(col("x")))

正如所料 pd.DataFrame(b2,columns=["x"]) 返回错误,因为 b2 是数组数组: ValueError: 传递值的形状是 (324, 324),索引意味着 (324, 1)

我应该如何定义我的数据框的列名,以及我的函数的输入?

任何评论将不胜感激。 谢谢

【问题讨论】:

【参考方案1】:

你能详细说明一下 pdf 应该是什么样子吗?

如果 b2 是 324x324,我猜你应该给出 324 列名称:

columns = ['x'+str(i) for i in range(b2.shape[1])]

【讨论】:

谢谢,我从没想过我们可以用迭代器给列命名。是的,b2 是一个 324x324 的 numpy.ndarray。现在,我想知道如何使用列名作为 UDF 的输入。有什么想法吗?

以上是关于如何将 pandas udf 应用于大型矩阵数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何从 pandas 数据框中的大型每日 JSON 数据集计算平均月值?

应用 pandas udf 后无法使用 .toPandas() 或 .collect():IndexError

将 UDF 动态应用于数据框中 N 列中的 1 到 N 列

如何使用 Groupby 将 Pandas TA 应用于数据框

为 PCA 生成加载矩阵时如何将 pandas 数据框列设置为索引

pyspark 中的 UDF 能否返回与列不同的对象?