有没有一种表示复数的方法来存储在spark df中?

0yg35tkg  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(398)

我有一个 ndarray 数据类型为的值的数目 numpy.complex128 . 当我尝试使用这些值创建spark df时,得到错误:

UserWarning: createDataFrame attempted Arrow optimization because 'spark.sql.execution.arrow.enabled' is set to true; however, failed by the reason below:
Unsupported numpy type 15
Attempting non-optimization as 'spark.sql.execution.arrow.fallback.enabled' is set to true.
TypeError: not supported type: <class 'complex'>

有人遇到过这样的情况吗?我怎么能表示这些复杂的数字,记住我最终需要检索它们?

xxls0lw8

xxls0lw81#

复数只是一对浮点数。如果你有一个numpy数组的形状 (n1, n2, ..., nZ) 和类型 complex128 ,你可以 view 它是一个形状数组 (n1, n2, ..., 2 * nZ) 和类型 float64 :

>>> a = np.linspace(0.+1.j, 1.+0j, 12).reshape(3, 4)
>>> a.shape
(3, 4)
>>> a.dtype
dtype('complex128')

>>> b = a.view(np.float64)
>>> b.shape
(3, 8)
>>> b.dtype
np.float64

实部和虚部占据了数组的所有其他元素。您可以验证数据在作为兼容数据类型查看时是否发生更改:

>>> (b[:, ::2] == a.real).all()
True
>>> (b[:, 1::2] == a.imag).all()
True

这个操作非常便宜:在相同的数据上创建一个具有不同步长的新数组对象。反序列化时,可以轻松地重新恢复形状数组 (n1, n2, ..., 2 * nZ) 和类型 float64 变成某种形状 (n1, n2, ..., nZ) 和类型 complex128 :

>>> a2 = b.view(np.complex128)
>>> a2.shape
(3, 4)
>>> a2.dtype
dtype('complex128')

相关问题