Это было давно, но я вернулся еще раз ..
Проблема: Когда я пытаюсь преобразовать любой столбец типа StringType, используя PySpark, в DecimalType (и FloatType), то, что возвращено, является нулевым значением.Такие методы, как F.substring
, все еще работают со столбцом, поэтому он, очевидно, все еще обрабатывается как строка, хотя я делаю все возможное, чтобы указать его в правильном направлении.
Репликация : Пример csv:
Currency,Total
USD,"3,472.43"
Пример .py файла:
from pyspark.sql import DataFrame, SparkSession, types, functions as F
from pyspark.sql.types import StructField, StringType, DoubleType, TimestampType
def transform():
spark = SparkSession.builder.appName(
"Example for StackOverflow").enableHiveSupport().getOrCreate()
raw_df = spark.read.csv('ex.csv', header=True)
processed_df = \
raw_df.withColumn('Amount2', F.col('Total').cast(types.DecimalType()))
processed_df.show()
processed_df = \
raw_df.withColumn('Amount3', F.substring(F.col('Total'), 0, 4))
processed_df.show()
processed_df = \
raw_df.withColumn('Amount2', F.col('Total').cast(types.DecimalType()))
processed_df.show()
transform()
При запуске выдает следующий вывод:
+--------+--------+-------+
|Currency| Total|Amount2|
+--------+--------+-------+
| USD|3,472.43| null|
+--------+--------+-------+
+--------+--------+-------+
|Currency| Total|Amount3|
+--------+--------+-------+
| USD|3,472.43| 3,47|
+--------+--------+-------+
+--------+--------+-------+
|Currency| Total|Amount2|
+--------+--------+-------+
| USD|3,472.43| null|
+--------+--------+-------+
Не совсем понимаю, гдездесь пересекаются провода.
Попытки решения : Я попробовал почти все, что мог придумать - используя StructType
(который превратил все в ноль)использование различных типов (DecimalType, FloatType и т. д.), изменение inferSchema с true на false, а затем обратно и, конечно, приведение к нему.Уверен, что это не должно быть так сложно - так где я ошибаюсь?