Загадочный 'pyarrow.lib.arrowinvalid: значение с плавающей запятой усечено' ошибка при использовании topandas () в dataframe в pyspark

Я использую toPandas () для не очень большого DataFrame, но получаю следующее исключение:

18/10/31 19:13:19 ERROR Executor: Exception in task 127.2 in stage 13.0 (TID 2264)
org.apache.spark.api.python.PythonException: Traceback (most recent call last):
    File "/home/hadoop/spark2.3.1/python/lib/pyspark.zip/pyspark/worker.py", line 230, in main
      process()
    File "/home/hadoop/spark2.3.1/python/lib/pyspark.zip/pyspark/worker.py", line 225, in process
      serializer.dump_stream(func(split_index, iterator), outfile)
    File "/home/hadoop/spark2.3.1/python/lib/pyspark.zip/pyspark/serializers.py", line 261, in dump_stream
      batch = _create_batch(series, self._timezone)
    File "/home/hadoop/spark2.3.1/python/lib/pyspark.zip/pyspark/serializers.py", line 239, in _create_batch
      arrs = [create_array(s, t) for s, t in series]
    File "/home/hadoop/spark2.3.1/python/lib/pyspark.zip/pyspark/serializers.py", line 239, in <listcomp>
      arrs = [create_array(s, t) for s, t in series]
    File "/home/hadoop/spark2.3.1/python/lib/pyspark.zip/pyspark/serializers.py", line 237, in create_array
      return pa.Array.from_pandas(s, mask=mask, type=t)
    File "pyarrow/array.pxi", line 474, in pyarrow.lib.Array.from_pandas
    File "pyarrow/array.pxi", line 169, in pyarrow.lib.array
    File "pyarrow/array.pxi", line 69, in pyarrow.lib._ndarray_to_array
    File "pyarrow/error.pxi", line 81, in pyarrow.lib.check_status
pyarrow.lib.ArrowInvalid: Floating point value truncated
        at org.apache.spark.api.python.BasePythonRunner$ReaderIterator.handlePythonException(PythonRunner.scala:298)
        at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:171)
        at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:121)
        at org.apache.spark.api.python.BasePythonRunner$ReaderIterator.hasNext(PythonRunner.scala:252)
        at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37)
        at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:439)
        at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
        at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage19.agg_doAggregateWithKeys_0$(Unknown Source)
        at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage19.processNext(Unknown Source)
        at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
        at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$10$$anon$1.hasNext(WholeStageCodegenExec.scala:614)
        at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
        at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:125)
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96)
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53)
        at org.apache.spark.scheduler.Task.run(Task.scala:109)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

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

Вероятно, потому что ваши данные содержат NaN, когда ожидается int - issues.apache.org/jira/browse/…

10465355 31.10.2018 13:40

Я проверил данные, нет NaN в поле ожидая int. Код хорошо работает в локальном режиме, но не работает в кластере.

Hao 01.11.2018 14:02

Есть обновления по этому поводу? Я перепробовал все каналы здесь. Ни один еще не работал.

Mehran F Langerudi 17.04.2019 21:27

Я решил эту проблему, заполнив все недостающие значения

Hao 21.04.2019 04:07
2
4
3 993
2

Ответы 2

Какую версию Pyarrow вы используете? Я считаю, что начиная с версии 0.11.0 небезопасное приведение типов вызовет ошибку.

Пожалуйста, добавляйте свои комментарии / вопросы в раздел комментариев, а не в качестве ответа.

Karthick Ramesh 01.11.2018 23:09

Я столкнулся с такой же ошибкой. Я думаю, что @bryanc прав в том, что вам нужно безопасно привести тип. В моем случае данные находятся в bigint, а функции требуется float / double. Так я и сделал

from pyspark.sql.types import DoubleType
df = df.withColumn("x_dbl", df["x"].cast(DoubleType()))

следуя подходу в как изменить столбец Dataframe с типа String на тип Double в pyspark

Затем вместо применения функции к «x» я применил функцию к «x_dbl», и это сработало. Надеюсь это поможет!

Другие вопросы по теме