Преобразовать значение строковой цены в двойной тип в pyspark - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть требование преобразовать значение цены в немецкий формат чисел. Но я использовал функцию regexp_replace в pyspark и обработал способ изменения. Но возвращаемый тип вывода - StringType , и мы должны привести его к DoubleType . При выполнении приведения выходные значения обновляются как null values ​​

Пример ввода данных:

|price_num|
|3,104.15 |
|4,534.56 |

Я использую выбор данных для создания нового столбца:

regexp_replace(regexp_replace(regexp_replace(format_number( -1 * col('price_num').cast('double'), 2), '\\.', '@'), ',', '\\.'), '@', ',').alias(german_format)

Мне нужно привести значение в doubleType .. Пожалуйста, предложите любой способ преобразования, а не заполнять нулевые значения.

Output without casting:
    price_num|german_format
    string   |string
    3,104.15 |-3.104,15
    4,534.56 |-4.534,56

My output when casting:
    price_num|german_format
    string   |double
    3,104.15 |null
    4,534.56 |null   #Invalid values

Expected output: 
    price_num|german_format
    string   |double
    3,104.15 |-3.104,15
    4,534.56 |-4.534,56

1 Ответ

0 голосов
/ 03 февраля 2020

Сначала вы должны удалить точки из европейского строкового числового формата цены и заменить запятую на точку. Затем вы можете привести его к двойному типу.

Попробуйте:

df = spark.createDataFrame([("-3.104,15",), ("-3.104,15",)], ['price_european_format'])

df.withColumn("price_double", regexp_replace(regexp_replace(
    col("price_european_format"), '\\.', ''), ',', '\\.').cast("double"))\
  .show()

Дает:

+---------------------+------------+
|price_european_format|price_double|
+---------------------+------------+
|            -3.104,15|    -3104.15|
|            -3.104,15|    -3104.15|
+---------------------+------------+
...