#python #dataframe #apache-spark #pyspark #apache-spark-sql
#python #фрейм данных #apache-spark #pyspark #apache-spark-sql
Вопрос:
Я хочу создать фрейм данных spark со столбцом чисел, некоторые из которых являются целыми, а другие — с плавающей запятой:
tmp = spark.createDataFrame([1.0, 2.1, 3], IntegerType()).toDF('bins')
Возникает эта ошибка:
Ошибка типа: значение поля: IntegerType не может принимать объект 1.0 в типе <класс ‘float’>
как я могу создать фрейм данных с 1.0, 2.1, 3
в столбце? Он должен быть 3
и не может быть приведен к значению с плавающей запятой, например: 3.0
. также 2.1
не может быть преобразован в 2
. если я использую эту команду вместо:
tmp = spark.createDataFrame([1.0, 2.1, 3], FloatType()).toDF('bins')
Возникает эта ошибка:
Ошибка типа: значение поля: FloatType не может принять объект 3 типа <class ‘int’>
как я могу создать этот фрейм данных?
Комментарии:
1. Вы не можете этого сделать. Даже если бы вы могли, вы не должны. Почему у вас не может быть
3.0
?2. на самом деле я могу иметь
3.0
но что, если этот список стал автоматически сгенерированным списком чисел? должен ли я преобразовать все целые числа в число с плавающей точкой? @BlueSheepToken3. Я так думаю, они должны математически представлять одно и то же. Иногда возникает ошибка точности в числах с плавающей запятой, но это все, что вы можете сделать, если у вас смешанные числовые типы
4. хорошо, вот и ответ. спасибо @BlueSheepToken
5. С удовольствием!
Ответ №1:
здесь может быть ваше решение :
from pyspark.sql import functions as F, Window as W, types as T
tmp = spark.createDataFrame(map(float, [1.0, 2.1, 3]), T.FloatType()).toDF("bins")
или другой :
tmp = (
spark.createDataFrame([1.0, 2.1, 3], T.StringType())
.toDF("bins")
.withColumn("bins", F.col("bins").cast(T.FloatType()))
)