Я работаю с PySpark и загружаю файл csv. У меня есть столбец с числами в европейском формате, это означает, что запятая заменяет точку и наоборот.

Например: у меня 2.416,67 вместо 2,416.67.

My data in .csv file looks like this -    
ID;    Revenue
21;    2.645,45
23;   31.147,05
.
.
55;    1.009,11

В пандах такой файл можно легко прочитать, указав параметры decimal=',' и thousands='.' внутри pd.read_csv() для чтения европейских форматов.

Код Pandas:

import pandas as pd
df=pd.read_csv("filepath/revenues.csv",sep=';',decimal=',',thousands='.')

Я не знаю, как это можно сделать в PySpark.

Код PySpark .

from pyspark.sql.types import StructType, StructField, FloatType, StringType
schema = StructType([
            StructField("ID", StringType(), True),
            StructField("Revenue", FloatType(), True)
                    ])
df=spark.read.csv("filepath/revenues.csv",sep=';',encoding='UTF-8', schema=schema, header=True)

Может ли кто-нибудь предложить, как мы можем загрузить такой файл в PySpark, используя вышеупомянутую функцию .csv()?

5
cph_sto 8 Окт 2018 в 15:43

2 ответа

Лучший ответ

Вы не сможете прочитать его как число с плавающей запятой из-за формата данных. Вам нужно прочитать его как строку, очистить и затем преобразовать в float:

from pyspark.sql.functions import regexp_replace
from pyspark.sql.types import FloatType

df = spark.read.option("headers", "true").option("inferSchema", "true").csv("my_csv.csv", sep=";")
df = df.withColumn('revenue', regexp_replace('revenue', '\\.', ''))
df = df.withColumn('revenue', regexp_replace('revenue', ',', '.'))
df = df.withColumn('revenue', df['revenue'].cast("float"))

Вы, вероятно, можете просто связать их все вместе:

df = spark.read.option("headers", "true").option("inferSchema", "true").csv("my_csv.csv", sep=";")
df = (
         df
         .withColumn('revenue', regexp_replace('revenue', '\\.', ''))
         .withColumn('revenue', regexp_replace('revenue', ',', '.'))
         .withColumn('revenue', df['revenue'].cast("float"))
     )

Обратите внимание: я не тестировал это, поэтому здесь может быть пара опечаток.

4
jhole89 2 Ноя 2018 в 13:50

Убедитесь, что ваша таблица SQL предварительно отформатирована для чтения NUMERIC вместо INTEGER. У меня были большие проблемы, пытаясь разобраться в кодировке, различных форматах точек, запятых и т. д., и в конце проблема была гораздо более примитивной, он был предварительно отформатирован для чтения только чисел типа INTEGER, и поэтому десятичные дроби никогда не принимались, будь то запятые или точки. Затем мне просто пришлось изменить свою таблицу SQL, чтобы вместо этого принимать реальные числа (NUMERIC), и все.

-1
braga461 8 Фев 2019 в 12:25