如何将 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
如何使用 Groupby 将 Pandas TA 应用于数据框