Значение NULL возвращается всякий раз, когда я пытаюсь привести строку к DecimalType в PySpark - PullRequest
0 голосов
/ 31 декабря 2018

Это было давно, но я вернулся еще раз ..

Проблема: Когда я пытаюсь преобразовать любой столбец типа 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, а затем обратно и, конечно, приведение к нему.Уверен, что это не должно быть так сложно - так где я ошибаюсь?

1 Ответ

0 голосов
/ 31 декабря 2018

Я думаю, что запятая вызывает проблемы.После загрузки данных raw_df вы можете заменить , на сумму:

processed_df = raw_df.withColumn('Amount2', F.regex_replace('Total',',',''))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...