Есть ли способ представления комплексных чисел для хранения в Spark DF? - PullRequest
1 голос
/ 08 мая 2020

У меня есть ndarray значений с dtype 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'>

Кто-нибудь сталкивался с подобной ситуацией? Как я могу представить эти комплексные числа, имея в виду, что в конечном итоге мне нужно будет получить их в дальнейшем?

1 Ответ

1 голос
/ 08 мая 2020

Комплексные числа - это просто пары чисел с плавающей запятой. Если у вас есть массив 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

Реальная и мнимая части занимают все остальные элементы массива. Вы можете убедиться, что данные не изменяются при просмотре как совместимый dtype:

>>> (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')
...