Spark создает фрейм данных со столбцом, состоящим из целых чисел и чисел с плавающей запятой

#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 но что, если этот список стал автоматически сгенерированным списком чисел? должен ли я преобразовать все целые числа в число с плавающей точкой? @BlueSheepToken

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

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